Python while loop for finding prime numbers

﹥>﹥吖頭↗ 提交于 2019-12-12 14:04:01

问题


As a first exercise with Python, I'm trying to write a program using loops to find primes. Everything works with a for loop so I am trying to use a while loop. This works but the program returns a few incorrect numbers.

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)

So the weird thing is that for max_num=100 it returns:

[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]

which is correct except for 9, 25 and 49 and I can't figure out why.


回答1:


You need to go up to and including the square root. Otherwise your algorithm will miss the family of prime squares (9, 25, and 49 are prime squares).

The quick fix is to replace < with <= as your stopping condition.

But consider changing the stopping condition to

primes[i] * primes[i] <= test_num

With this test, you don't dip in and out of floating point.




回答2:


If you would like to find the next primes for each iteration, probably this is a better function since it bypasses the procedure of giving input.

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()

Then you may use the followings to iterate:

next(x)

or

[next(x) for _ in range(20)]

which gives the output

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]

Hope this is a graceful function for writing while loop for prime numbers aiming at beginners.




回答3:


for i in range(2,51): for j in range(2,i): if (i%j)==0: break else: print(i," is prime number")



来源:https://stackoverflow.com/questions/34664067/python-while-loop-for-finding-prime-numbers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!