python somme de nombres premiers
Je suis attachant à faire un programme en python qui permettra de générer de la somme des nombres premiers pour un certain nombre, mais le programme ne donne pas le résultat correct,s'il vous plaît dites-moi pourquoi.
b=1
#generates a list of numbers.
while b<100:
b=b+1
x = 0.0
a = 0
d = 0
#generates a list of numbers less than b.
while x<b:
x=x+1
#this will check for divisors.
if (b/x)-int(b/x) == 0.0:
a=a+1
if a==2:
#if it finds a prime it will add it.
d=d+b
print d
Je l'ai fait à générer une liste de nombres premiers avec succès, mais je ne pouvais pas obtenir les premiers à ajouter.
C'est le code que j'ai utilisé pour générer une liste de nombres premiers.
b=1
while b<1000:
b=b+1
n = b
x = 0.0
a = 0
while x<n:
x=x+1
if (n/x)-int(n/x) == 0.0:
a=a+1
if a==2:
print b
- Avez-vous le code que vous avez écrit?
- que voulez-vous dire? le code est ci-dessus, ou voulez-vous dire le code qui a généré une liste de nombres premiers.
- Je voulais dire, avez-vous le code pour la somme de la liste, mais j'ai ajouté que faire ci-dessous.
- Pouvez-vous être plus précis sur votre objectif kyle? Somme des nombres premiers pour un certain nombre = foo(15) = 3+5 = 8?
- Ne pas le vérifier
a==2
aller à l'extérieur de l'intérieur alors? - Vos commentaires dire que vous êtes la génération d'une liste, mais toutes tes variables sont des nombres. Êtes-vous sûr de savoir ce qu'est un liste c'est?
- Je pense que quand @kylek dit "générer une liste de nombres premiers" e n'a sans doute pas dire "liste" comme en Python type de données. Comme vous le dites, il n'y a pas de liste dans le code, donc j'attends e ne voulais pas dire de cette façon.
Vous devez vous connecter pour publier un commentaire.
Votre
d
variable est en cours de réinitialisation lors de chaque itération de ta boucle externe. Déplacer l'initialisation de sortir de cette boucle.En outre, la
a == 2
case ne doit avoir lieu qu'une fois par itération de la boucle externe. La faire sortir de la boucle interne.Résultat:
Pendant que nous y sommes, nous allons essayer de nettoyer le code de sorte qu'il est plus compréhensible. Vous pouvez déplacer la boucle interne dans sa propre fonction, afin que les lecteurs puissent mieux comprendre son but:
Il est également utile d'utiliser des noms de variables qui décrivent ce qu'ils représentent:
for
boucles sont plus idomatic quewhile
boucle qui incrémente un compteur:Si vous vous sentez audacieux, vous pouvez utiliser interprétations de la liste de réduire le nombre de boucles que vous utilisez:
b
vous devez 1) seulement de vérifier jusqu'à la racine carrée ou 2) mieux encore, l'utilisation d'un tamis.Kevin correctement répondu à la question que vous avez demandé. Permettez-moi de répondre à la question que vous n'a pas demander, mais devrait avoir: Quelle est la meilleure façon de calculer la somme des nombres premiers de moins de n. La réponse est d'utiliser un tamis:
Ce code met en œuvre le Crible d'Eratosthène, en additionnant les nombres premiers comme il va. Il travaille à plusieurs reprises par le choix de la plus petite décroise nombre (p dans le code ci-dessus, qui est sélectionné lorsque
sieve[p]
estTrue
), puis en croisant l'ensemble de ses multiples (je dans le code ci-dessus, qui est incrémenté par p pour calculer les multiples de p) à partir de sa place (depuis toutes petites composites ont déjà été barré). Un exemple d'utilisation de la fonction estprint sumPrimes(100)
, qui imprime 1060, qui est la réponse correcte.Noter que Roland réponse ne permet pas de mettre en œuvre le Crible d'Eratosthène, même s'il affirme qu'il n'; l'utilisation de la fonction modulo est le don que Roland en réponse utilise division de première instance, pas le Crible d'Eratosthène.
Si vous êtes intéressé par la programmation par les nombres premiers, j'ai modestement recommander ce essai à mon blog.
si vous faites cela pour l'amour de l'apprentissage de python il y a plus concis (>> moins de risques d'erreurs) façons de le faire. À partir de votre question je suis en supposant que vous êtes en essayant de la somme de tous les nombres premiers ci-dessous et dont 100:
imprime
1060
Interprétations de la liste sont un puissant outil en Python. Pensez à eux comme une boucle for en stéroïdes. 🙂 Vous pouvez les utiliser pour mettre en œuvre division de première instance, ce qui est une façon simple de trouver les nombres premiers.
Il fonctionne comme ceci:
La
prime_list
fonction:Maintenant pour l'explication. À l'exception de 2, tous les nombres premiers sont impairs. Donc, tous les nombres impairs de 3 à
num
(100 dans ce cas) sont des candidats pour les nombres premiers. Nous allons générer une liste de ceux que fait à (a):Pour un nombre impair
c
être le premier, on doit s'assurer quec
modulo tous les précédents numéros impairsp
doit être non nul. Disonsc
est de 25.Puis
p
est dans:Maintenant vérifier
c
modulop
:Comme nous le savons, 25 % 5 == 0, de sorte que le deuxième élément de la liste est
False
. Cependant, pour un nombre premier, tous les éléments de la liste doivent être remplies:Donc 25 n'est pas un nombre premier.
Essayez encore une fois pour
c
est 41:Et en effet 41 est un nombre premier.
Donc prime_list renvoie la liste des nombres premiers:
À la somme que nous utilisons simplement la
sum()
fonction:Edit: sur la Base des commentaires, j'ai essayé de l'amélioration que WillNess suggéré et un véritable tamis à l'aide des ensembles:
Certains horaires pour
num=100
:Et
num=1000
:num = 5000
:Et enfin
num=50000
:if all(c % p != 0 for p in range(3, sqrt(c)+1, 2))
pour grand le gain en vitesse. 🙂 Sisqrt
calcul prend trop de temps, ré-écrire cela comme une simple boucle, avec le chèquep*p <= c
(peut-être plus rapide).a*b == n
eta >= sqrt(n)
alors sûrementb =< sqrt(n)
, de sorte que vous auriez rencontrés il avant lea
. L'un d'eux est<= sqrt(n)
pour sûr, s'il y a desa,b
tels quen == a*b
. Donc, si nous sommes arrivés à lasqrt
et n'a toujours pas trouvé un tel nombre, - c'est un premier.t
est au-dessus desqrt(num)
. À ce moment, toutes les valeurs de gauche des candidats sont des nombres premiers. Mais ce ne sera pas l'aider: tourner un jeu dans la liste, à chaque itération (pour trouver son faible elemt, non?) gâche la complexité globale désespérément. Vous avez besoin de générer des nombres premiers ci-dessous sqrt(num) séparément, pour les soustractions. Pouvez-vous utiliser le tamis méthode pour cela??Somme juste la liste à l'aide du code que vous avez utilisé pour générer la liste:
d
est un entier.sum_of_prime(3)
retour 2 aussi? ce n'est pas cohérente avec le retour des 2 pournum=2
ensuite. et que dire de l'efficacité? comment faire de votre empiriques commandes de croissance comparer avec les autres réponses?