Python素数检查器

我一直在试图编写一个程序,将采取一个input的数字,并检查,看看它是否是一个素数。 如果这个数字实际上是一个素数,那么我迄今所做的代码是完美的。 如果这个数字不是一个素数,那么这个行为就会很奇怪 我想知道是否有人可以告诉我什么是代码问题。

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 

input24时给出的结果是:不是素不素不素素

我将如何修复每个奇数的报告素数的错误,而不是每个偶数的素数

一旦你知道一个数字不是素数,你就需要停止迭代。 一旦发现素数退出while循环,请添加一个break

只需对代码进行最小限度的更改即可使其工作:

 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') 

你的algorithm相当于:

 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平方根。 另外,你可以跳过两个testing偶数。

有了这些build议:

 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 

请注意,此代码不能正确处理0和负数。

我们通过使用一个生成器expression式来replacefor循环来简化这个过程。

 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)) 
 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

你的代码的两个主要问题是:

  1. 在指定一个不是素数的数字之后,即使您已经知道它不是素数,也会继续检查其余的除数,这会导致在打印“不是素数”之后打印“素数”。 提示:使用“break”语句。
  2. 您在检查所有需要检查的因子之前指定一个数字素数,因为您正在循环打印“素数”。 所以你多次得到“素数”,一次对于每一个除数都没有平均进入被测数字。 提示:使用循环的else子句只有在循环退出而不中断时才打印“素数”。

一对夫妇相当重要的低效率:

  1. 你应该跟踪你已经发现的数字是主要的,只有那些数字除以。 当你已经除以2时,为什么要除以4? 如果一个数可以被4整除,也可以被2整除,那么你已经可以把它整除了,不需要再除以4。
  2. 你只需要testing被测数字的平方根,因为任何大于这个数的因子都需要乘以一个小于这个数的数,那么当你到达一个大数时,就已经testing过了。
 def is_prime(n): return all(n%j for j in xrange(2, int(n**0.5)+1)) and n>1 

你的问题是,循环继续运行,甚至认为你已经“下定了决心”。 您应该在a=a+1之后添加换行符

这个例子是使用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) 

它使用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) 

在这里,所以请让我知道,如果我的方式,但我会这样做:

 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" 

在你确定一个数字是复合的(而不是素数)之后,你的工作就完成了。 你可以用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)) 

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

 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" 

素数检查。

 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) 

这将做到这一点:

 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" 
 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() 
 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) 

 # is digit prime? we will see (Coder: Chikak) 

# is digit prime? we will see (Coder: Chikak)

def is_prime(x):
flag = False
如果x <2:
返回False
其他:
计数范围(2,x):
如果x%count == 0:
flag = True
打破
如果flag == True:
返回False
返回True