【发布时间】:2013-01-29 21:30:00
【问题描述】:
def test_prime(n):
q = True
for p in range(2,n): #Only need to check up to rootn for primes and n/2 for factors
if int(n%p) is 0:
q = False
print(p, 'and', int(n/p), 'are factors of ', n)
if q:
print(n, 'IS a prime number!')
else:
print(n, 'IS NOT a prime number')
我刚刚开始玩 Python,我正在整理一些零碎的东西来打发时间。我一直在尝试测试素数,并有显示非素数因子的想法。我在上面组合的函数似乎运行良好,除了输出不一致。
例如如果我设置 n = 65432 我得到...
2 and 32716 are factors of 65432
4 and 16358 are factors of 65432
8 and 8179 are factors of 65432
8179 and 8 are factors of 65432
16358 and 4 are factors of 65432
32716 and 2 are factors of 65432
65432 IS NOT a prime number
这是我所期望的。但是如果我设置 n = 659306 我会得到......
2 and 329653 are factors of 659306
71 and 9286 are factors of 659306
142 and 4643 are factors of 659306
4643 and 142 are factors of 659306
9286 and 71 are factors of 659306
659306 IS NOT a prime number
这是不同的,因为它最后不包括因子 329653。这不是问题,因为所有因素都显示在某处,但令我烦恼的是,我不知道为什么某些数字会发生这种情况!
只是为了告诉你我不是一个完全的白痴,我发现这似乎只发生在长度超过 5 个字符的整数值上。有人可以告诉我为什么这两种情况下的输出不同吗?
【问题讨论】:
-
在您的代码中,我看到一个
range[2,n](不是 n/2),以及一条评论说“...将测试到 n/2”。如果你这样做了,那么你会得到你的输出。但是您编写的代码应该按规定工作。不过,您最多需要测试 n/2+1。 -
不要使用 is 来测试数字相等性。请改用 ==。
-
是的,我试过玩那条线。这就是为什么它目前计入 n 的原因。如果我输入 for p in range(2,int((n/2)+1)): 那么我会得到相同的结果。
-
啊哈。 == 给出相同的结果。那么就这样整理了!但我仍然不明白为什么它适用于较小的值?
-
很有趣,因为我也使用
is得到了“正确”的结果。它必须与机器整数大小有关:我在 64 位 Linux 上运行,@DSM 的测试在我点击0x8000000000000000之前不会返回False。有趣的是,您应该在这么小的数字上出错;除非您使用无符号 16 位整数,否则您的限制是 65535?
标签: python factorization