大学问题,我不知道该怎么办(素数)



我目前正在上大学,我有一项任务是将45以下的素数和非素数相乘,这样它们的乘积就不会超过45。语言是python,我试过做循环,用模检查素数和非素数,但我不知道该怎么办。(不能使用数组或任何相关的仅循环,而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)

您可以创建这样的素数检查函数:

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

如果我理解正确,您需要将素数与非素数相乘。这意味着产物将由3个或更多素数形成。

要在产品中有3个素数,您最多可以有2个素数5次。你最多可以有3次,最多5次,7/11不超过一次。

所以你只需要考虑2,3,5,7和11作为素数,并将它们组合成3个或更多的集合,而不需要超过45:

你可以为产品中2s、3s、5s、7s和11s的数量嵌套5个循环。

例如:

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,实际上也只有primes会被计数,因为随着rest的减少,以前primes的倍数将不再均匀地除以其余的

输出:

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

最新更新