【问题标题】:Python while loop for finding prime numbers用于查找素数的 Python while 循环
【发布时间】:2016-04-12 08:52:30
【问题描述】:

作为 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,我不知道为什么。

【问题讨论】:

  • primes[i] &lt;= math.sqrt(test_num)
  • 你注意到数字是奇数吗?
  • 一个while ... else!记得当它进入else 时玩得开心:)(我不了解其他人,但我一直避免while-elsefor-else 并且从未在其他人的代码中看到它们;他们觉得不直观)

标签: python python-3.x while-loop primes


【解决方案1】:

您需要达到并包括平方根。否则,您的算法将错过素数平方系列(9、25 和 49 是素数平方)。

快速解决方法是将&lt; 替换为&lt;= 作为您的停止条件。

但考虑将停止条件改为

primes[i] * primes[i] &lt;= test_num

通过此测试,您不会陷入和退出浮点数。

【讨论】:

    【解决方案2】:

    如果您想为每次迭代找到下一个素数,这可能是一个更好的函数,因为它绕过了提供输入的过程。

    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]
    

    希望这是一个针对初学者编写素数while循环的优雅函数。

    【讨论】:

      【解决方案3】:

      对于范围内的 i (2,51): 对于范围内的 j (2,i): 如果 (i%j)==0: 休息 别的: print(i,"是质数")

      【讨论】:

        【解决方案4】:

        试试这个:

        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.")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-02
          • 1970-01-01
          • 2021-12-19
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          相关资源
          最近更新 更多