作为Python的第一个练习,我正在尝试使用循环编写程序来查找素数。一切都与for循环一起工作所以我试图使用while循环。这可以,但程序返回一些不正确的数字。
import math
# looking for all primes below this number
max_num = int(input("max number?: "))
primes = [2] # start with 2
test_num = 3 # which means testing starts with 3
while test_num < max_num:
i = 0
# It's only necessary to check with the primes smaller than the square
# root of the test_num
while primes[i] < math.sqrt(test_num):
# using modulo to figure out if test_num is prime or not
if (test_num % primes[i]) == 0:
test_num += 1
break
else:
i += 1
else:
primes.append(test_num)
test_num += 1
print(primes)
所以奇怪的是,对于max_num=100
,它会返回:
[2, 3, 5, 7, 9, 11, 13, 17, 19, 23, 25, 29, 31, 37, 41, 43, 47, 49, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
这是正确的,除了9,25和49,我无法弄清楚原因。
答案 0 :(得分:8)
你需要去包括平方根。否则,您的算法将错过素数平方族(9,25和49是素数平方)。
快速解决方法是将<
替换为<=
作为停止条件。
但请考虑将停止条件更改为
primes[i] * primes[i] <= test_num
通过此测试,您不会进出浮点。
答案 1 :(得分:0)
如果你想为每次迭代找到下一个素数,可能这是一个更好的函数,因为它绕过了给出输入的过程。
import math
def primes():
(h,n) = (2,1)
k = 2
while True:
if any(k % i == 0 for i in range(2,k))==False: # h is composite number, so continue iteration
(h,n) = (k,n+1) # After the for loop we can find out the next prime number
k += 1
else:
k += 1 # Remember to continue the loop, if not then next function may return the same number
continue
yield h
x = prime()
然后您可以使用以下内容进行迭代:
next(x)
或
[next(x) for _ in range(20)]
给出输出
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]
希望这是一个优雅的函数,用于编写针对初学者的素数循环。
答案 2 :(得分:0)
对于范围在(2,51)中的i: 对于范围(2,i)中的j: 如果(i%j)== 0: 打破 其他: print(i,“是素数”)
答案 3 :(得分:0)
尝试一下:
inp = int(input("Enter the number: "))
isDiv = False
i = 2
while i < inp:
if inp%i ==0:
isDiv = True
print(f"{inp} is divisible by {i}.")
i+=1
if isDiv:
print(f"Hence {inp} is not a prime number.")
else:
print(f"{inp} is a prime number.")