簡體   English   中英

檢查一個數是否可​​以表示為 Python 中兩個半質數之和

[英]Check whether a number can be expressed as a sum of two semi-prime numbers in Python

半質數是可以表示為兩個質數的乘積的數。 示例:

我正在嘗試編寫一個 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='')  

在你提到的情況下,62 可以表示為 58 和 4 的 2 個半素數之和,即 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM