使用全数而不是525.31e + 10

时间:2017-10-12 06:09:04

标签: python python-3.x primes largenumber

我写了一个可以找到素数的程序。

from time import sleep
soNotPrimes = []
n = input("Start finding primes at: ")
n = int(n)
k = 2
found_factors = 0
nSQRT = n**0.5
while True:
    kinn = n/k
    if found_factors == 1:
        print("Okay, look man, I totally found a non-prime number. It's", n)
        n += 1
        k = 2
        found_factors = 0
        nSQRT = n**0.5
        continue

    if (k > nSQRT) and found_factors == 0:
        print("Oh yeah man, I found a prime!", n)
        n += 1
        k = 2
        found_factors = 0
        nSQRT = n**0.5
        continue


    if kinn.is_integer():
        found_factors += 1

    k += 1

然而,这不起作用,因为如果数字足够高,Python会开始将它们解释为例如525.31e + 10。这总是等于5253100000000,这不是素数,因为它是偶数。有没有办法让Python按字面解释这些数字?

1 个答案:

答案 0 :(得分:0)

我不能重现你的问题但总的来说,我们希望避免浮点数蔓延到我们的结果和我们的比较中。您的代码中会出现两个这样的地方:

kinn = n/k

我们可以用模数%替换以获得整数余数而不是浮点数,并且:

nSQRT = n**0.5

我们可以通过比较kn的平方来取代,通过对等式的两边进行平方并避免浮点。为上述代码重新编写代码并简化我们的工作:

n = int(input("Start finding primes at: "))
k = 2

while True:

    if n % k == 0:
        print("Okay, look man, I totally found a non-prime number. It's", n)
        n += 1
        k = 2
        continue
    elif k * k > n:
        print("Oh yeah man, I found a prime!", n)
        n += 1
        k = 2
        continue

    k += 1

看看上面的效果是否适合你。您仍需要对代码进行微调,以正确处理2或更少的起始编号。