12
votes

Trouver le premier nombre de nombres premiers en python

Je suis nouveau dans le monde de la programmation. J'écrivais juste ce code dans Python pour générer n nombres premiers. L'utilisateur doit saisir la valeur pour N qui est le nombre total de nombres premiers à imprimer. J'ai écrit ce code mais cela ne jette pas la sortie souhaitée. Au lieu de cela, il imprime les nombres premiers jusqu'au nième numéro.

Par exemple: l'utilisateur entre la valeur de n = 7.

sortie souhaitée: 2, 3, 5, 7, 11, 13, 19 < / p>

sortie réelle: 2, 3, 5, 7

Veuillez conseiller gentiment. xxx


4 commentaires

Ce n'est pas une réponse, mais de commencer vos boucles à 1 est très non idiomatique et confondez la plupart des gens de lire votre code. Le fait que vous devez utiliser (x + 1) et (i + 1) car la boucle liée doit signaler ce fait.


Ce dont vous avez besoin est un tamis préférentiel (un type d'algorithme rapide pour trouver des nombres premiers), un tamis d'eratosthènes (Vérifiez Wikipedia) et voici une implémentation en php scriptol.com/programming/sieve.php


Voir aussi cette question: Stackoverflow.com/Questtions/1042902/...


Voir aussi: Stackoverflow.com/questions/2068372/...


29 Réponses :


7
votes

La ligne k = k-1 ne fait pas ce que vous pensez. Cela n'a aucun effet. Changer k n'affecte pas la boucle. À chaque itération, k est attribué à l'élément suivant de la plage, de sorte que toute modification que vous avez apportée à k à l'intérieur de la boucle sera écrasée.


1 commentaires

J'ai mal interprété la question initiale et j'ai été retiré par la manière dont A a été utilisé. C'est un excellent indice qui devrait conduire la personne dans la bonne direction.



0
votes

Ce code est très confus, et je ne peux pas comprendre exactement ce que vous pensais quand vous l'avez écrit ou ce que vous essayiez d'accomplir. La première chose à laquelle je suggérerais lorsque vous essayez de déterminer comment CODURE consiste à commencer par faire de vos noms de variables extrêmement descriptifs. Cela vous aidera à obtenir les idées de ce que vous faites directement dans votre tête, et cela aidera également quiconque tente de vous aider à vous aider à vous montrer comment obtenir vos idées droites.

Cela étant dit, voici un exemple de programme qui accomplir quelque chose près de l'objectif: xxx

Ce bit de code: xxx

pourrait éventuellement être remplacé par le quelque peu lent, mais éventuellement plus compréhensible: xxx


2 commentaires

Vous pouvez rendre cela plus efficace si vous remplacez le xrange avec (2, (Possible // 2), 1) - car il n'est pas nécessaire de tester des diviseurs supérieurs à la moitié du nombre.


C'est vrai, mais je voulais le rendre aussi simple que possible aussi évident que possible. Vous pouvez également faire Xrange (3, (Possible // 2), 2) et être encore meilleur. :-)



32
votes

Utilisation d'une refente :)

#!/usr/bin/python

import re, sys


def isPrime(n):
    # see http://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/
    return re.match(r'^1?$|^(11+?)\1+$', '1' * n) == None


N = int(sys.argv[1]) # number of primes wanted (from command-line)
M = 100              # upper-bound of search space
l = list()           # result list

while len(l) < N:
    l += filter(isPrime, range(M - 100, M)) # append prime element of [M - 100, M] to l
    M += 100                                # increment upper-bound

print l[:N] # print result list limited to N elements



4
votes

Ce que vous voulez, c'est quelque chose comme ceci:

x = int(input("Enter the number:"))
count = 0
num = 2
while count < x:
     if isnumprime(x):
        print(x)
        count += 1
     num += 1


1 commentaires

Il y a une erreur dans votre code. La ligne 5 devrait lire si ISnumPrime (num) et la ligne 6 doit lire imprimer num . x est le nombre de nombres premiers que vous souhaitez, de sorte que vous ne voulez pas vérifier si c'est premier. Au lieu de cela, vous devez vérifier si num est prime. Autre que cela, le code a l'air bien.



2
votes

Jusqu'à ce que nous avons des nombres premiers, prenez des chiffres naturels un par un, vérifiez si l'un des prime-premiers à la fois recueillis.

Si aucun ne le fait, "yay", nous avons une nouvelle Prime ... p>

C'est ça. P>

>>> def generate_n_primes(N):
...     primes  = []
...     chkthis = 2
...     while len(primes) < N:
...         ptest    = [chkthis for i in primes if chkthis%i == 0]
...         primes  += [] if ptest else [chkthis]
...         chkthis += 1
...     return primes
...
>>> print generate_n_primes(15)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]


0 commentaires

3
votes

Utilisation d'expressions de générateur pour créer une séquence de tous les nombres premiers et tranche le 100e hors de cela.

from itertools import count, islice
primes = (n for n in count(2) if all(n % d for d in range(2, n)))
print("100th prime is %d" % next(islice(primes, 99, 100)))


0 commentaires

15
votes

Pour référence, il existe une différence de vitesse assez importante entre les différentes solutions indiquées. Voici un certain code de comparaison. La solution pointée par Lennart s'appelle "historique", celle proposée par les fourmis s'appelle "naïf", et celle de RC s'appelle "Regexp" " xxx

la sortie de cette opération sur Ma machine pour n = 100 est: xxx

Comme vous pouvez le constater, il y a une très grande écart. Ici, il est à nouveau pour 1000 (sorties primaires supprimées): xxx


3 commentaires

La version "historique", même si le plus rapide ici est encore algorithmiquement déficient. Stackoverflow.com/a/10733621/849891 calcule 10 000 nombres premiers en 0,15 sec sur ideone.com .


@Willness existe-t-il un meilleur algorithme que vous avez fait référence?


@Vicrobot La réponse liée a un lien en bas; Il y a aussi "rwh-prime" ... c'est ce que je me souviens. Sinon, votre recherche est aussi bonne que la mienne. :)



15
votes

Mise en œuvre super rapide de tamis par David Eppstein - prend 0,146S pour les 1000 premiers premiers Sur mon PC:

def gen_primes():
    """ Generate an infinite sequence of prime numbers.
    """
    # Maps composites to primes witnessing their compositeness.
    # This is memory efficient, as the sieve is not "run forward"
    # indefinitely, but only as long as required by the current
    # number being tested.
    #
    D = {}  

    # The running integer that's checked for primeness
    q = 2  

    while True:
        if q not in D:
            # q is a new prime.
            # Yield it and mark its first multiple that isn't
            # already marked in previous iterations
            # 
            yield q        
            D[q * q] = [q]
        else:
            # q is composite. D[q] is the list of primes that
            # divide it. Since we've reached q, we no longer
            # need it in the map, but we'll mark the next 
            # multiples of its witnesses to prepare for larger
            # numbers
            # 
            for p in D[q]:
                D.setdefault(p + q, []).append(p)
            del D[q]

        q += 1

primes = gen_primes()


x = set()
y = 0
a = gen_primes()
while y < 10000:
  x |= set([a.next()])
  y+=1

print "x contains {:,d} primes".format(len(x))
print "largest is {:,d}".format(sorted(x)[-1])


2 commentaires

Pourquoi définir? Donnez-vous des éléments en double?


Stackoverflow.com/a/10733621/849891 : Aprit la complexité de l'espace de O (N) à propos de O (SQRT (N ))). Améliore également les ordres de croissance.



4
votes

Voici ce que j'avais fini par imprimer les premiers n premiers: xxx


1 commentaires

Pour un rapport qualité / code potentiel> N , vous testez la division par 2,3,4, ..., N-2, N-1 . Mais avons-nous vraiment besoin de tester si 26 est divisé par 20? Ou même 7? .. Avons-nous besoin de tester un nombre pair au-dessus de 2, du tout?



0
votes
n=int(input("Enter the number:: "))

for i in range(2,n):
    p=i
    k=0
    for j in range(2,p-1):
        if(p%j==0):
            k=k+1
    if(k==0):
        print(p)

1 commentaires

Bienvenue dans le débordement de la pile! Plutôt que de publier uniquement un bloc de code, s'il vous plaît expliquer pourquoi ce code résout le problème posé. Sans explication, ce n'est pas une réponse.



-1
votes

Je ne suis pas familier avec Python, donc j'écris la partie Counter C (trop paresseuse pour écrire pseudo code ..: p) Trouver le premier n chiffres premiers .. // Imprime tous les nombres premiers .. Ne vous inquiétez pas de créer un tableau et de le retourner, etc.

void find_first_n_primes(int n){
   int count = 0;
   for(int i=2;count<=n;i++){
     factFlag == 0; //flag for factor count... 
     for(int k=2;k<sqrt(n)+1;k++){
       if(i%k == 0) // factor found..
        factFlag++;
     }
      if(factFlag==0)// no factors found hence prime..
        {
         Print(i);   // prime displayed..
         count++;
        }
   }
}


0 commentaires

-1
votes

Cela pourrait aider:

def in_prime(n):
    p=True
    i=2
    if i**2<=n:
        if n%i==0:
            p=False
            break
    if (p):
        return n


1 commentaires

Ce n'est pas clair comment générer, SyntaxError: "Break 'extérieure boucle pourrait aider.



1
votes
def isPrime(y):
  i=2
  while i < y:
    if y%i == 0 :
      return 0
      exit()
    i=i+1
  return 1

x= raw_input('Enter the position 1st,2nd,..nth prime number you are looking for?: ')
z=int(x)
# for l in range(2,z)
count = 1
n = 2
while count <= z:
  if isPrime(n) == 1:
    if count == z:
      print n
    count +=1
  n=n+1

0 commentaires

0
votes

Cela pourrait aider:

import sys
from time import time
def prime(N):
    M=100
    l=[]
    while len(l) < N:
        for i in range(M-100,M):    
            num = filter(lambda y :i % y == 0,(y for y in range(2 ,(i/2)))) 
            if not num and i not in [0,1,4]:
                l.append(i)
        M +=100
    return l[:N]


def dotime(func, n):
    print func.__name__
    start = time()
    print sorted(list(func(n))),len(list(func(n)))
    print 'Time in seconds: ' + str(time() - start)


if __name__ == "__main__":
    dotime(prime, int(sys.argv[1]))


0 commentaires

0
votes

Voici une simple version récursive: xxx

Voici une version à l'aide d'une fonction récursive avec la mémoire!: xxx

espère qu'il aide: )


0 commentaires

0
votes

Essayez d'utiliser en boucle pour vérifier le compte, c'est facile. Trouvez le code de code ci-dessous:

i=1
count = 0;
x = int(input("Enter the number:\n"))
while (count < x):
c=0
for j in range (1, (i+1), 1):
    a = i%j
    if (a==0):
        c = c+1

if (c==2):
      print (i)
      count = count+1
i=i+1


0 commentaires

0
votes

Tout en jouant avec des nombres premiers dans Python V3, j'ai remarqué que le plus petit nombre par lequel un nombre composé (non-premier) est divisible est lui-même toujours une prime inférieure à la racine carrée du nombre sous test.

Vous trouverez ci-dessous ma mise en œuvre de cette constatation pour calculer le premier N nombres premiers. P>

1 000 premiers nombres premiers dans 0,028S | 10 000 premiers nombres premiers en 0.6S | Premier 100 000 nombres premiers en 14,3s p>

Le snippet ci-dessous indique également combien de temps la génération a pris et imprime les nombres premiers dans un bon format de table. p>

import time
import math

def first_n_Primes(n):
    number_under_test = 4
    primes = [2,3]
    while len(primes) < n:
        check = False
        for prime in primes:
            if prime > math.sqrt(number_under_test) : break
            if number_under_test % prime == 0:
                check = True
                break
        if not check:
            for counter in range(primes[len(primes)-1],number_under_test-1,2):
                if number_under_test % counter == 0:
                    check = True
                    break
        if not check:
            primes.append(number_under_test)
        number_under_test+=1
    return primes

start_time = time.time()
data = first_n_Primes(1000)
end_time = time.time()

i = 1
while i < len(data)+1:
    print('{0: <9}'.format(str(data[i-1])), end="")
    if i%10 == 0: print("")
    i+=1

print("\nFirst %d primes took %s seconds ---" % (len(data),end_time - start_time))


0 commentaires

0
votes

Ceci est ma version

import timeit
import math

__author__ = 'rain'


primes = [2]

def is_prime(n):
    for prime in primes:
        if n % prime == 0:
            return False
    return True


def find_nth_prime(n):
    current_index = 0
    while(len(primes) < n):
        if current_index == 0:
            start_value = 3
            end_value = 2 * 2
        else:
            start_value = primes[current_index - 1] * primes[current_index - 1] + 1
            end_value = primes[current_index] * primes[current_index]
        for i in range(start_value, end_value):
            if is_prime(i):
                primes.append(i)
        current_index += 1
    return primes[n-1]


def solve():
    return find_nth_prime(10001)

print solve()

print timeit.timeit(solve, number=10)


0 commentaires

0
votes

Essayez ceci:

primeList = []
for num in range(2,10000):
    if all(num%i!=0 for i in range(2,num)):
        primeList.append(num)
x = int(raw_input("Enter n: "))
for i in range(x):
    print primeList[i]


0 commentaires

0
votes
max = input("enter the maximum limit to check prime number");
if max>1 :
    for i in range (2,max):
        prime=0;
        for j in range (2,i):
            if(i%j==0):
                prime=1;
                break
        if(prime==0 and i!=0):
            print(i,"is prime number");
else:
    print("prime no start from 2");

0 commentaires

-3
votes
def Isprime(z):
    '''returns True if the number is prime OTW returns false'''
    if z<1:
        return False
    elif z==1:
        return False

    elif z==2:
        return True 

    else:
        for i in range(2,z):
            if z%i==0:
                return False
            else:
                return True
This is the way I did it. Of course, there are so many ways you can do it.

2 commentaires

Ce code renvoie true pour 21 (3 x 7) qui n'est pas préféré. En fait, il renvoie vrai pour les nombres impairs en général.


faire z à sqrt de z



0
votes
prime=2
counter = 0
x = int(input("Enter the number:\n"))
while (counter < x):
    if all(prime%j!=0 for j in range(2, prime)):
        print(prime, "is a prime number")
        counter+=1


    prime+=1

1 commentaires

besoin d'un texte à ajouter en réponse à l'expliquer



1
votes

Vous pouvez prendre le nombre d'entrées de numéro de choix. Selon votre méthode, j'ai pris ici un nombre prédéfini de 10:

i = 2
if i == 2:
    print(str(i) + "is a prime no")
    i = i+1
c=1

while c<10:
    for j in range(2, i):
        if i%j==0:
            break

    if i == j+1:
        print(str(i) + "is aa prime no")
        c=c+1

    i=i+1


0 commentaires

0
votes
count = -1
n = int(raw_input("how many primes you want starting from 2 "))
primes=[[]]*n
for p in range(2, n**2):
    for i in range(2, p):
        if p % i == 0:
            break
    else:
        count +=1
        primes[count]= p
        if count == n-1:
            break

print (primes)
print 'Done'

0 commentaires

0
votes

anwer ici est simple i.e exécutez la boucle 'n' fois.

n=int(input())
count=0
i=2
while count<n:
    flag=0
    j=2
    while j<=int(i**0.5):
        if i%j==0:
            flag+=1
        j+=1
    if flag==0:
        print(i,end=" ")
        count+=1
    i+=1


0 commentaires

0
votes
#!/usr/bin/python3
import sys

primary_numbers = [1, 2]


def is_prime(i):
    for pn in enumerate(primary_numbers[2:]):
        if i % pn[1] == 0:
            return False

    return True

def main(position):
    i = 3
    while len(primary_numbers) < int(position):
        print(i)
        res = is_prime(i)
        if res:
            primary_numbers.append(i)
        i += 2


if __name__ == '__main__':
    position = sys.argv[1]
    main(position)
    print(primary_numbers)

1 commentaires

Ce programme semble répondre à une question différente de ce que l'OP est de demander. Cela ne semble pas non plus fonctionner.



0
votes

Salut! Je suis très nouveau à coder, je viens de commencer 4 jours de retour. J'ai écrit un code pour redonner aux 1000 premiers numéros premiers dont 1. ont un look xxx


1 commentaires

Ce programme proclame: "1 est un premier", ce qui n'est pas. Le code essaie également de trop de diviseurs.



0
votes
def isprime(n):
    if n <= 1:
        return False
    for x in range(2, n):
        if n % x == 0:
            return False
    else:
        return True

def list_prime(z):
    y = 0
    def to_infinity():
        index=0
        while 1:
            yield index
            index += 1
    for n in to_infinity():
        if y < z:
            if isprime(n):
                y = y + 1
                print(n, end='\n', flush=True)
        else:break
    print(f'\n {z} prime numbers are as above.')

# put your range below
list_prime(10)

0 commentaires

1
votes

Les plus rapides xxx


0 commentaires