素数检测器在某些数字上失败?

时间:2013-05-14 05:45:27

标签: python

def is_prime(x):
    list1 = []
    count = 1
    if x < 0:
        return False
    elif x == 1:
        return False
    elif x == 2:
        return True
    for item in range(x):
        list1.append(x - count)
        count += 1 
        if count == x:
            list1.remove(1)
    for item in list1:
        if x / item == 1:
            return False
    else:
        return True

这在一些数字上失败了,我不确定为什么。我很确定这主要是我的数学问题,还是我对素数的理解?我正在通过代码学院学习,所以请随意向我提示正确的方向而不是给我完全的答案。提前谢谢大家!

5 个答案:

答案 0 :(得分:1)

您似乎正在使用Python 2,而Python 3和Python 2之间的除法运算的差异会导致您的问题。在Python 2中,普通除法得到一个整数,例如5/4 = 1,而在Python 3中,5/4 = 1.25。因此,在python 2中,可以将5视为函数中的非素数。

您可以尝试其他数学运算,例如模块%来进行判断,而不是除法。

答案 1 :(得分:0)

import math
def is_prime(x):
    count = 0
    if x < 0:
        return False
    elif x == 1:
        return False
    elif x == 2:
        return True
    for n in range(1,int(math.ceil(math.sqrt(x)))+1): #only looks up to sqrt(x)
        if not x % n: #if n is divisor of x then it is factor
            count += 1
        if count > 1: #if we have 2 or more factors then it isn't a prime 
            return False
    return True

一些测试:

print(all(is_prime(p) for p in [2, 3, 5, 7, 11, 23, 29, 41, 43, 47, 61, 67, 83, 89, 101, 113, 131]))
print(any(is_prime(np) for np in [1,4,6,8,9,10,12,14,15,16]))

>>> 
True
False

答案 2 :(得分:0)

查看modulo operator,在分割两个数字时返回余数

>>> 4 % 2
0
>>> 5 % 2
1

答案 3 :(得分:0)

试试这个我只测试过几个数字:

def is_prime(n):

    i = 2
    sq_root_n = n**0.5
    if n <= 0:
        return False
    while i < sq_root_n:
        if n % i == 0:
            return False
        i += 1
    return True

答案 4 :(得分:0)

    def is_prime(x):
    maxdiv = x - 1
    if x < 2:
        return False
    elif x == 2:
        return True
    elif x >= 2:
        for n in range(2,maxdiv):
            if x % n == 0:
                print '%d is not prime. I divided it by %d' % (x, n)
                return False
        else:
            return True