print - Comprobador de número Python Prime
print prime numbers python (14)
Esta pregunta ya tiene una respuesta aquí:
He intentado escribir un programa que tomará un número impugnado, y verifico si es un número primo. El código que he hecho hasta ahora funciona perfectamente si el número es de hecho un número primo. Si el número no es un número primo, actúa de manera extraña. Me preguntaba si alguien podría decirme cuál es el problema con el código.
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
el resultado dado cuando se ingresa 24 es: no primer no primer no primer primo
¿Cómo puedo solucionar el error con el informe principal en cada impar y no primo para cada par
Comprobación de número primo.
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)
Debes dejar de iterar una vez que sabes que un número no es primo. Agregue un break
una vez que encuentre primer para salir del ciclo while.
Realizando solo cambios mínimos a su código para que funcione:
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'')
Tu algoritmo es equivalente a:
for a in range(a, num):
if a % num == 0:
print(''not prime'')
break
else: # loop not exited via break
print(''prime'')
Si lo aplica a una función, puede prescindir de break
y for-else:
def is_prime(n):
for i in range(3, n):
if n % i == 0:
return False
return True
Incluso si vas a usar la fuerza bruta para el primer como este, solo necesitas iterar hasta la raíz cuadrada de n
. Además, puede omitir la prueba de los números pares después de dos.
Con estas sugerencias:
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
Tenga en cuenta que este código no maneja correctamente 0
, 1
y números negativos.
Hacemos esto más simple al usar all
con una expresión de generador para reemplazar el for-loop.
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))
Después de determinar que un número es compuesto (no primo), su trabajo está hecho. Puedes salir del loop con 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
Además, puede probar y familiarizarse con algunos constructos en Python. Su lazo se puede acortar a un trazador de líneas que todavía lee bien en mi opinión.
any(num % a == 0 for a in range(2, num))
Empieza aquí, así que por favor avíseme si estoy de acuerdo, pero lo haría así:
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"
Esta es una ligera variación en que mantiene un registro de los factores.
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"
Este ejemplo es use reduce (), pero lo desacelera:
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)
Utiliza Sieve Of Atkin , más rápido que arriba:
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)
Esto haría el trabajo:
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"
Los dos problemas principales con su código son:
- Después de designar un número no principal, continúa verificando el resto de los divisores aunque ya sepa que no es primo, lo que puede llevarlo a imprimir "primero" después de imprimir "no primero". Sugerencia: use la declaración `break ''.
- Usted designa un número principal antes de haber comprobado todos los divisores que debe verificar, porque está imprimiendo "primo" dentro del ciclo. Por lo tanto, obtiene "primo" varias veces, una para cada divisor que no va uniformemente al número que se está probando. Sugerencia: use una cláusula
else
con el ciclo para imprimir "primero" solo si el ciclo sale sin romperse.
Un par de ineficiencias bastante significativas:
- Debes hacer un seguimiento de los números que ya has encontrado que son primos y solo dividir por esos. ¿Por qué dividir por 4 cuando ya has dividido por 2? Si un número es divisible por 4, también es divisible por 2, por lo que ya lo hubieras atrapado y no hay necesidad de dividir entre 4.
- Solo necesita probar hasta la raíz cuadrada del número que se está probando porque cualquier factor más grande que eso tendría que multiplicarse con un número más pequeño que eso, y eso ya habría sido probado para cuando llegue al más grande.
Tu problema es que el bucle continúa funcionando aunque ya hayas tomado una decisión. Debe agregar el break
línea después de a=a+1
def is_prime(x):
flag = False
if x < 2:
return False
else:
for count in range(2, x):
if x % count == 0:
flag = True
break
if flag == True:
return False
return True
# is digit prime? we will see (Coder: Chikak)
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()
def is_prime(n):
return all(n%j for j in xrange(2, int(n**0.5)+1)) and n>1
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
Tomado de:
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)