簡體   English   中英

大學問題,我不知道該怎么辦(質數)

[英]College problem and I have no idea what to do (Prime numbers)

我目前在上大學,我有一項作業涉及將 45 以下的素數和非素數相乘,這樣他們的乘積不會超過 45。語言是 python,我嘗試過做 for 循環並檢查素數而不是素數模數,但我不知道從哪里開始。 (不能使用數組或任何僅與循環相關的東西,而 else、elif 等)

for num in range (1, 45):
    if num > 1:
        for num2 in range(2, 45):
            if (num%num2) == 0:
                n = num2
                print(n, 'is Prime')
                if num * num2 < 45:
                    print('Number ', num, '*', num2, '=', num*num2)

我真正想要實現的是首先找到所有素數,然后將它們乘以所有非素數。 那些素數和非素數在 1 - 45 的范圍內。然后,我必須將它們相乘並且它們的乘積必須小於 45,然后打印出來。

更新:所以我嘗試了 Thanh Tùng Nguyễn 的程序,它構建得非常好,但我無法使用函數,因為我沒有被教導過(也就是很奇怪),我試圖做的只是獲取函數是什么和試圖將它實現到循環本身中,將 n 設置為布爾值,但我的打印沒有任何意義,我無法捕捉到正在發生的事情。 終端只是完全空着。 我的猜測是在最后一個“如果不是”語句上,我可能寫錯了,因為我自己無法理解為什么當我將它視為整個塊中的函數時它不起作用。

這是我得到的:

from math import sqrt

for num1 in range (2, 46):
    if num1 <= 1:
        n = False
    for i in range (2, int(sqrt(num1))):
        if num1%i == 0:
            n = False
    n = True
    if n == True:
        for num2 in range (1, 46):
            if num2 <= 1:
                n = False
            for j in range (2, int(sqrt(num2))):
                if num2%j == 0:
                    n = False
            n = True
            if not n == True:
                if num1 * num2 < 45:
                    print(num1, '*', num2, '=', num1*num2)

如果我理解正確,您需要將素數與非素數相乘。 這意味着乘積將由 3 個或更多素數組成。

要在乘積中有 3 個素數,您最多可以有 2 個 5 次。 您最多可以有 3 次 3 次,最多 5 次兩次,7/11 最多一次。

所以你只需要考慮 2、3、5、7 和 11 作為素數,並將它們組合成 3 個或更多的集合,而不超過 45:

您可以為產品中的 2s、3s、5s、7s 和 11s 的數量嵌套 5 個 for 循環。

例如:

for p2 in range(7):
    for p3 in range(4):
        for p5 in range(3):
            for p7 in range(2):
                for p11 in range(2):
                    prod = 2**p2 * 3**p3 * 5**p5 * 7**p7 * 11**p11
                    if prod > 45 : continue
                    if p2+p3+p5+p7+p11 < 3: continue
                    if p2:  print(2,'x',prod//2,'=',prod)
                    if p3:  print(3,'x',prod//3,'=',prod)
                    if p5:  print(5,'x',prod//5,'=',prod)
                    if p7:  print(7,'x',prod//7,'=',prod)
                    if p11: print(11,'x',prod//11,'=',prod)

輸出:

3 x 15 = 45
5 x 9 = 45
3 x 9 = 27
2 x 21 = 42
3 x 14 = 42
7 x 6 = 42
2 x 15 = 30
3 x 10 = 30
5 x 6 = 30
2 x 9 = 18
3 x 6 = 18
2 x 22 = 44
11 x 4 = 44
2 x 14 = 28
7 x 4 = 28
2 x 10 = 20
5 x 4 = 20
2 x 6 = 12
3 x 4 = 12
2 x 18 = 36
3 x 12 = 36
2 x 4 = 8
2 x 20 = 40
5 x 8 = 40
2 x 12 = 24
3 x 8 = 24
2 x 8 = 16
2 x 16 = 32à

你也可以反過來做,通過將構成每個數字的素數計數到 45,如果有 3 個或更多素數,則在打印時打印屬於數字的一部分:

for prod in range(8,46):
    primeCount = 0
    rest = prod
    for prime in range(2,12):
        while rest and rest % prime == 0:
            primeCount += 1
            rest = rest//prime
    if primeCount<3: continue
    if prod%2==0:  print(prod,'=',2,'x',prod//2)
    if prod%3==0:  print(prod,'=',3,'x',prod//3)
    if prod%5==0:  print(prod,'=',5,'x',prod//5)
    if prod%7==0:  print(prod,'=',7,'x',prod//7)
    if prod%11==0: print(prod,'=',11,'x',prod//11)

請注意,即使我在計數循環中除以 non=primes,實際上也只會計算素數,因為隨着rest素數的減少,先前素數的倍數將不再平均划分其余素數。

輸出:

8 = 2 x 4
12 = 2 x 6
12 = 3 x 4
16 = 2 x 8
18 = 2 x 9
18 = 3 x 6
20 = 2 x 10
20 = 5 x 4
24 = 2 x 12
24 = 3 x 8
27 = 3 x 9
28 = 2 x 14
28 = 7 x 4
30 = 2 x 15
30 = 3 x 10
30 = 5 x 6
32 = 2 x 16
36 = 2 x 18
36 = 3 x 12
40 = 2 x 20
40 = 5 x 8
42 = 2 x 21
42 = 3 x 14
42 = 7 x 6
44 = 2 x 22
44 = 11 x 4
45 = 3 x 15
45 = 5 x 9

你可以像這樣創建一個質數檢查函數:

from math import sqrt

def checkPrime(num):
    if num <= 1:
        return False
    for i in range(2, int(sqrt(num))+1):
        if num % i == 0:
            return False
    return True

請注意,您只需檢查 2 到 √n 即可對其進行優化。 從那里,只需找到 45 以下的所有質數並將其與非質數相乘:

from math import sqrt

def checkPrime(num):
    if num <= 1:
        return False
    for i in range(2, int(sqrt(num))+1):
        if num % i == 0:
            return False
    return True

for n in range(2, 45+1):
    if checkPrime(n):
        for j in range(1, 45+1):
            if not checkPrime(j):
                if n * j < 45:
                    print(n, " * ", j, " = ", n*j)

輸出:

2  *  1  =  2
2  *  4  =  8
2  *  6  =  12
2  *  8  =  16
2  *  9  =  18
2  *  10  =  20
2  *  12  =  24
2  *  14  =  28
2  *  15  =  30
2  *  16  =  32
2  *  18  =  36
2  *  20  =  40
2  *  21  =  42
2  *  22  =  44
3  *  1  =  3
3  *  4  =  12
3  *  6  =  18
3  *  8  =  24
3  *  9  =  27
3  *  10  =  30
3  *  12  =  36
3  *  14  =  42
5  *  1  =  5
5  *  4  =  20
5  *  6  =  30
5  *  8  =  40
7  *  1  =  7
7  *  4  =  28
7  *  6  =  42
11  *  1  =  11
11  *  4  =  44
13  *  1  =  13
17  *  1  =  17
19  *  1  =  19
23  *  1  =  23
29  *  1  =  29
31  *  1  =  31
37  *  1  =  37
41  *  1  =  41
43  *  1  =  43

暫無
暫無

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

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