我一直在尝试编写一个程序,该程序将采用输入的数字,并检查它是否为素数。到目前为止,我所做的代码完全可以正常工作,如果这个数字实际上是素数。如果数字不是素数,那就很奇怪了。我想知道是否有人能告诉我代码的问题。
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时给出的结果是: 不是素 不是素 不是素 素
我如何在每个偶数
的每个奇数和非素数上修复报告素数的错误答案 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
请注意,此代码无法正确处理0
,1
和负数。
我们通过使用带有生成器表达式的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
取自:
答案 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)
您的代码存在两个主要问题:
else
子句仅在循环退出而不断开时才打印“prime”。一些非常显着的低效率:
答案 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