Python Prime数字检查器

时间:2013-09-16 17:19:45

标签: python primes

我一直在尝试编写一个程序,该程序将采用输入的数字,并检查它是否为素数。到目前为止,我所做的代码完全可以正常工作,如果这个数字实际上是素数。如果数字不是素数,那就很奇怪了。我想知道是否有人能告诉我代码的问题。

a=2
num=13
while num > a :
  if num%a==0 & a!=num:
    print('not prime')
    a=a+1
  else:
    print('prime')
    a=(num)+1

输入24时给出的结果是: 不是素 不是素 不是素 素

我如何在每个偶数

的每个奇数和非素数上修复报告素数的错误

14 个答案:

答案 0 :(得分:61)

一旦你知道一个数字不是素数,你需要停止迭代。找到素数后,添加break以退出while循环。

只对代码进行微小的更改才能使其正常工作:

a=2
num=13
while num > a :
  if num%a==0 & a!=num:
    print('not prime')
    break
  i += 1
else: # loop not exited via break
  print('prime')

您的算法等同于:

for a in range(a, num):
    if a % num == 0:
        print('not prime')
        break
else: # loop not exited via break
    print('prime')

如果你把它扔进一个函数,你可以省去break和for-else:

def is_prime(n):
    for i in range(3, n):
        if n % i == 0:
            return False
    return True

即使您要使用这样的素数蛮力,您也只需要迭代到n的平方根。此外,您可以跳过在两次之后测试偶数。

有了这些建议:

import math
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

请注意,此代码无法正确处理01和负数。

我们通过使用带有生成器表达式的all替换for循环来使这更简单。

import math
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))

答案 1 :(得分:19)

def isprime(n):
    '''check if integer n is a prime'''

    # make sure n is a positive integer
    n = abs(int(n))

    # 0 and 1 are not primes
    if n < 2:
        return False

    # 2 is the only even prime number
    if n == 2: 
        return True    

    # all other even numbers are not primes
    if not n & 1: 
        return False

    # range starts with 3 and only needs to go up 
    # the square root of n for all odd numbers
    for x in range(3, int(n**0.5) + 1, 2):
        if n % x == 0:
            return False

    return True

取自:

  

http://www.daniweb.com/software-development/python/code/216880/check-if-a-number-is-a-prime-number-python

答案 2 :(得分:12)

def is_prime(n):
    return all(n%j for j in xrange(2, int(n**0.5)+1)) and n>1

答案 3 :(得分:10)

您的代码存在两个主要问题:

  1. 在指定一个不是素数的数字后,你继续检查其余的除数,即使你已经知道它不是素数,这可能导致它在打印“非素数”后打印“素数”。提示:使用`break'语句。
  2. 在检查了需要检查的所有除数之前,指定一个数字素数,因为您正在循环中打印“prime” 。因此,您可以多次获得“素数”,一次针对每个除数均未达到被测试的数量。提示:使用循环的else子句仅在循环退出而不断开时才打印“prime”。
  3. 一些非常显着的低效率:

    1. 你应该跟踪你已经发现的数字的数字,并且只能除以那些数字。当你已经除以2时为什么除以4?如果一个数字可以被4整除,它也可以被2整除,所以你已经抓住它并且没有必要除以4。
    2. 您只需要测试最多被测试数字的平方根,因为任何大于该值的因子都需要乘以小于该值的数字,并且在您到达之前已经测试过了更大的一个。

答案 4 :(得分:3)

这个例子是使用reduce(),但是减慢它:

def makepnl(pnl, n):
    for p in pnl:
        if n % p == 0:
            return pnl
    pnl.append(n)
    return pnl

def isprime(n):
    return True if n == reduce(makepnl, range(3, n + 1, 2), [2])[-1] else False

for i in range(20):
    print i, isprime(i)

使用Sieve Of Atkin,比上面更快:

def atkin(limit):
    if limit > 2:
        yield 2
    if limit > 3:
        yield 3

    import math
    is_prime = [False] * (limit + 1)

    for x in range(1,int(math.sqrt(limit))+1):
        for y in range(1,int(math.sqrt(limit))+1):
            n = 4*x**2 + y**2

            if n<=limit and (n%12==1 or n%12==5):
                # print "1st if"                                                                                                                    
                is_prime[n] = not is_prime[n]
            n = 3*x**2+y**2
            if n<= limit and n%12==7:
                # print "Second if"                                                                                                                 
                is_prime[n] = not is_prime[n]
            n = 3*x**2 - y**2
            if x>y and n<=limit and n%12==11:
                # print "third if"                                                                                                                  
                is_prime[n] = not is_prime[n]

    for n in range(5,int(math.sqrt(limit))):
        if is_prime[n]:
            for k in range(n**2,limit+1,n**2):
                is_prime[k] = False

    for n in range(5,limit):
        if is_prime[n]: yield n

def isprime(n):
    r = list(atkin(n+1))
    if not r: return False
    return True if n == r[-1] else False

for i in range(20):
    print i, isprime(i)

答案 5 :(得分:2)

你的问题是循环继续运行,即使你已经“已经下定决心”了。您应该在break

之后添加行a=a+1

答案 6 :(得分:2)

Begginer在这里,所以请告诉我,如果我的方式,但我这样做:

def prime(n):
    count = 0
    for i in range(1, (n+1)): 
         if n % i == 0: 
             count += 1
    if count > 2:
        print "Not a prime"
    else:
        print "A prime"

答案 7 :(得分:1)

确定某个数字是复合数字(非素数)后,您的工作就完成了。您可以使用break退出循环。

while num > a :
  if num%a==0 & a!=num:
    print('not prime')
    break          # not going to update a, going to quit instead
  else:
    print('prime')
    a=(num)+1

此外,您可能会尝试更熟悉Python中的一些构造。你的循环可以缩短为单行,在我看来仍然很好。

any(num % a == 0 for a in range(2, num))

答案 8 :(得分:0)

这可以胜任:

number=int(raw_input("Enter a number to see if its prime:"))
if number <= 1:
    print "number is not prime"
else:
    a=2
    check = True
    while a != number:
        if number%a == 0:
            print "Number is not prime"
            check = False
            break
        a+=1
    if check == True:
        print "Number is prime" 

答案 9 :(得分:0)

a=input("Enter number:")

def isprime(): 

    total=0
    factors=(1,a)# The only factors of a number
    pfactors=range(1,a+1) #considering all possible factors


    if a==1 or a==0:# One and Zero are not prime numbers
        print "%d is NOT prime"%a


    elif a==2: # Two is the only even prime number
        print "%d is  prime"%a


    elif a%2==0:#Any even number is not prime except two
        print "%d is NOT prime"%a  



    else:#a number is prime if its multiples are 1 and itself 
         #The sum of the number that return zero moduli should be equal to the "only" factors
        for number in pfactors: 
            if (a%number)==0: 
                total+=number
        if total!=sum(factors):
            print "%d is NOT prime"%a 
        else:
             print "%d is  prime"%a
isprime()

答案 10 :(得分:0)

这是一个微小的变化,它跟踪因素。

def prime(a):
    list=[]
    x=2
    b=True

    while x<a:
        if a%x==0:
            b=False
            list.append(x)
        x+=1

    if b==False:
        print "Not Prime"
        print list
    else:
        print "Prime"

答案 11 :(得分:0)

素数检查。

def is_prime(x):
    if x < 2:
        return False
    else:
        if x == 2:
            return True
        else:
            for i in range(2, x):
                if x % i == 0:
                    return False
            return True
x = int(raw_input("enter a prime number"))
print is_prime(x)

答案 12 :(得分:0)

max=int(input("Find primes upto what numbers?"))
primeList=[]
for x in range(2,max+1):
    isPrime=True
    for y in range(2,int(x**0.5)+1) :
        if x%y==0:
            isPrime=False
            break

    if isPrime:
        primeList.append(x)
print(primeList)

答案 13 :(得分:-1)

AES