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. P>
sortie souhaitée: 2, 3, 5, 7, 11, 13, 19 < / p>
sortie réelle: 2, 3, 5, 7 p>
Veuillez conseiller gentiment. p>
29 Réponses :
La ligne k = k-1 code> ne fait pas ce que vous pensez. Cela n'a aucun effet. Changer
k code> n'affecte pas la boucle. À chaque itération,
k code> est attribué à l'élément suivant de la plage, de sorte que toute modification que vous avez apportée à
k code> à l'intérieur de la boucle sera écrasée. P>
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.
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: p> Ce bit de code: p> pourrait éventuellement être remplacé par le quelque peu lent, mais éventuellement plus compréhensible: p>
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. :-)
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
Pour quiconque se demande comment regregez les nombres premiers: Réponse de @brent montre comment cela se compare aux autres méthodes et qui est meilleure en performance - Stackoverflow.com/questions/1628949/...
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
Il y a une erreur dans votre code. La ligne 5 devrait lire si ISnumPrime (num) code> et la ligne 6 doit lire
imprimer num code>.
x code> 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 code> est prime. Autre que cela, le code a l'air bien.
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]
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)))
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" " la sortie de cette opération sur Ma machine pour n = 100 est: p> Comme vous pouvez le constater, il y a une très grande écart. Ici, il est à nouveau pour 1000 (sorties primaires supprimées): p>
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. :)
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])
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.
Voici ce que j'avais fini par imprimer les premiers n premiers:
Pour un rapport qualité / code potentiel> N code>, vous testez la division par 2,3,4, ..., N-2, N-1 code>. 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?
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)
Bienvenue dans le débordement de la pile! Plutôt que de publier uniquement un bloc de code, s'il vous plaît expliquer i> pourquoi ce code résout le problème posé. Sans explication, ce n'est pas une réponse.
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++; } } }
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
Ce n'est pas clair comment générer, SyntaxError: "Break 'extérieure boucle code> pourrait aider.
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
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]))
Voici une simple version récursive: Voici une version à l'aide d'une fonction récursive avec la mémoire!: p> espère qu'il aide: ) p> p>
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
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))
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)
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]
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");
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.
Ce code renvoie true code> pour 21 (3 x 7) qui n'est pas préféré. En fait, il renvoie
vrai code> pour les nombres impairs en général.
faire z à sqrt de z
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
besoin d'un texte à ajouter en réponse à l'expliquer
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
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'
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
#!/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)
Ce programme semble répondre à une question différente de ce que l'OP est de demander. Cela ne semble pas non plus fonctionner.
Ce programme proclame: "1 est un premier", ce qui n'est pas. Le code essaie également de trop de diviseurs.
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)
Les plus rapides
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/...