检查数字是否可以表示为Python中两个半素数的和

时间:2019-02-27 15:10:06

标签: python

半素数是可以表示为两个素数的乘积的数字。示例:55 = 5 * 11

我正在尝试编写一个Python程序,该程序检查一个数字是否可以表示为两个半素数之和(不一定是唯一的)。

示例1:

输入:30
输出:是

说明:30可以表示为15 + 15,其中15是半质数,因为它是两个质数5 * 3的乘积。

示例2:

输入:62
输出:否

说明:尽管62本身是一个半素数(31 * 2),但是,它不能表示为两个半素数的总和。

这是我试图做的,但并非在所有情况下都有效。

MAX = 200
arr = []
sprime = [False] * (MAX)

def computeSP():
    for i in range(2,MAX):
        cnt,num,j = 0,i,2
        while (cnt<2 and j*j <= num):
            while(num % j == 0):
                num = int(num/j)
                cnt = cnt + 1
            j = j+1

        if(num > 1):
            cnt = cnt + 1

        if(cnt == 2):
            sprime[i] = True
            arr.append(i)

def checkSP(n):
    i = 0
    while(arr[i] <= n/2):
        if(sprime[n - arr[i]]):
            return True
        i = i+1
    return False

computeSP()

n = int(input())

if(checkSP(n)):  
    print('Yes',end='')  
else:
    print('No',end='')  

1 个答案:

答案 0 :(得分:0)

如您所提到的,

62可以表示为2个半素数之和,即58和4,即62 = 58 + 4 58可以表示为29,2的因数(素数) 4可以表示为2,2(素数)的因子

因此,回答您的问题是您的逻辑是错误的,因为62也可以用类似的方式表示。

如果您想要代码,那么就可以了:

import math
def factors(n):
    bool = False
    for i in range(2, n):
        if n % i == 0:
            a = i
            b = int(n / a)
            if prime_number(a) and prime_number(b):
                print("factors of ",n,"is",a,b)
                bool = True
                break
    return bool


def prime_number(m):
    prime = True
    for i in range(3, m):
        if m % i == 0:
            prime = False
            break
    return prime


if __name__ == '__main__':
    num = int(input())
    z = math.ceil(num/2)
    a = "NO"
    for i in range(1, z):
        x = i
        y = num - i
    if factors(x) and factors(y):
        print("diff x,y=", x, y)
        a = "YES"
        break
print(a)