编程语言
首页 > 编程语言> > Python分解功能导致不稳定的结果

Python分解功能导致不稳定的结果

作者:互联网

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个字符长度的整数值上.有人可以告诉我为什么这两种情况的输出不同?

解决方法:

你想要n%p == 0,而不是n%p是0.是测试身份,而不是相等,而不是每个0都与其他0相同.

>>> 659306 % 329653
0
>>> (659306 % 329653) == 0
True
>>> (659306 % 329653) is 0
False
>>> id(0)
136748976
>>> id(659306 % 329653) 
3070888160

那里的id基本上对应于内存中的位置.

可以这样想:如果你有一个加元,我有一个加元,那么它们在价值上是相等的(1 == 1),但它们不是同一个物体(我的一美元硬币不是与你的一美元硬币相同.)我们可以分享相同的硬币,但我们没有必要这样做.

[PS:您可以使用n // p进行整数除法而不是int(n / p).]

标签:python,factorization
来源: https://codeday.me/bug/20190714/1460884.html