Impression des nombres premiers de 1 à 100
Ce code c++ imprime la suite des nombres premiers: 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97.
Mais je ne pense pas que c'est la façon dont mon livre veut qu'il soit écrit. Il mentionne quelque chose à propos de la racine carrée d'un nombre. J'ai donc essayé de changer mon 2ème boucle à for (int j=2; j<sqrt(i); j++)
mais il ne me donne pas le résultat que j'ai besoin.
Comment aurais-je besoin de modifier ce code à la façon dont mon livre veut qu'il soit?
int main ()
{
for (int i=2; i<100; i++)
for (int j=2; j<i; j++)
{
if (i % j == 0)
break;
else if (i == j+1)
cout << i << " ";
}
return 0;
}
Un entier premier numéro est celui qui a
exactement deux diviseurs,
à savoir 1 et le nombre lui-même. Écrire,
exécuter et tester un programme en C++ qui
découvre et imprime tous les nombres premiers
moins de 100. (Indice: 1 est un nombre premier
numéro. Pour chaque nombre de 2 à 100,
trouver Reste = Nombre % n, où n
varie de 2 à sqrt(nombre). \ N
est plus grand que sqrt(nombre), la
le nombre n'est pas divisible par n.
Pourquoi? Si le Reste est égal à 0, le
le nombre n'est pas un nombre premier.)
source d'informationauteur Sahat Yalkabov
Vous devez vous connecter pour publier un commentaire.
Trois façons:
1.
2.
3.
Edit: Dans le troisième exemple, nous gardons la trace de l'ensemble de nos précédemment calculé les nombres premiers. Si un nombre est divisible par un nombre premier, il est également le premier <= diviseur qui il est également divisble par. Cela réduit le calcul par un facteur de primes_in_range/total_range.
Si
j
est l'égalité des àsqrt(i)
il pourrait également être un facteur, non seulement si elle est petits.Pour itérer jusqu'à et y compris
sqrt(i)
dans votre boucle, vous pourriez écrire:(Par rapport à l'utilisation
sqrt(j)
cela a l'avantage de ne pas besoin de la conversion de nombres en virgule flottante.)Si un numéro a diviseurs, au moins l'un d'entre eux doit être inférieur ou égal à la racine carrée de ce nombre. Lorsque vous vérifiez les diviseurs, vous avez uniquement besoin de vérifier pour la racine carrée, pas tout le chemin jusqu'à le nombre en cours d'essai.
C'est ma très simple programme en c++ à la liste des nombres premiers entre 2 et 100.
effectivement la meilleure solution est d'utiliser "Un premier tamis ou du premier numéro de tamis" qui "est un fast-type d'algorithme pour trouver les nombres premiers" .. wikipedia
La simple (mais pas la plus rapide) algorithme est appelé "crible d'eratosthène" et peut être fait dans les étapes suivantes(à partir de wikipédia nouveau):
À l'aide de Crible d'Eratosthène logique, je suis en mesure d'obtenir les mêmes résultats avec beaucoup plus rapide vitesse.
Mon code de démo VS accepté de répondre à.
Comparant les
count
mon code prend de manière significative moins d'itération pour terminer le travail. Checkout les résultats pour les différents
N
valeurs à la fin.Pourquoi ce code fonctionne mieux que d'ores et déjà acceptées:
- même les chiffres ne sont pas contrôlés, même une fois tout au long du processus.
- deux boucles internes et externes sont de vérifier que dans la limite du possible. Pas de superflu et de contrôles.
Code:
Pour
N = 1000
mon code prend 1166 itérations, a accepté de répondre prend 5287 (4,5 fois plus lent)Pour
N = 10000
mon code prend 14637 itérations, a accepté de répondre prend 117526 (8 fois plus lent)Pour
N = 100000
mon code prend 175491 itérations, a accepté de répondre prend 2745693 (15.6 fois plus lent)Trouver les nombres premiers inférieurs à un 100 est particulièrement agréable et facile:
La racine carrée de 100 est 10et si cette version de le crible d'Eratosthène avec le 2-3 roue utilise les multiples de juste les premiers ci-dessus 3 qui ne sont pas plus grand que 10 -- à savoir. 5 et 7 seul! -- pour tamiser la 6-sont premiers entre eux ci-dessous 100 manière progressive.
C'est bien de changer votre boucle for pour
for (int j=2; j<=sqrt(i); j++)
mais alors vous aussi besoin de changer quelque chose d'autre. À la recherche spécifiquement à votre impression condition,pourquoi que jamais être déclenchée si vous ne itérer jusqu'à
sqrt(i)
? Où pouvez-vous déplacer lecout
pour changer cela? (Astuce: vous pouvez déplacer l'impression de sortir de la boucle, puis faire usage d'un certain type de variable d'indicateur)- Je vérifier si un nombre est premier ou pas avec le code suivant( bien sûr, utiliser sqrt ):
- Je utiliser cette méthode pour déterminer les nombres premiers:
En utilisant les règles de divisibilité des nombres premiers peuvent être trouvés dans la O(n) et c'est vraiment efficace Les règles de Divisibilité
La solution serait fondé sur chacun des chiffres du nombre...
Voici ma mise en œuvre de Crible d'Eratosthène (pour les nombres premiers entre 2 & n)
}
c'est mon approche à partir d'un simple blog:
- Voir plus à: http://www.programmingtunes.com/generation-of-prime-numbers-c/#sthash.YoWHqYcm.dpuf
De trouver si pas. est premier ou pas du C++:
Je l'ai fait en perl basée sur la réponse la plus populaire par ProdigySim la 2ème méthode. J'ai dû ajouter un
break
équivalent en perl,last
juste après laprint $i . " \n";
pour éviter de reproduire les nombres premiers deux fois.Un programme simple pour imprimer "N" nombres premiers. Vous pouvez utiliser N valeur de 100.
voici un code simple pour l'impression de tous les nombres premiers jusqu'à un nombre donné n,
J'ai toujours l'utiliser (il est facile et rapide) :
Ici, elle est sortie de ce code:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Le livre semble être "C++ pour les Ingénieurs et les Scientifiques."
écrit par Gary Bronson (googlé).
Est-ce une réponse possible? À mon humble avis, il est surprenant.
J'ai eu à lire la question (du livre) à quelques reprises.
Mon interprétation:
Pour chaque nombre N: 2 <= N < 100 vérifier si c'est le premier.
Comment? Pour chaque diviseur D: 2 <= D < sqrt(N) ,
si D divise N, N n'est pas premier,
si D > sqrt(N), N est premier.
Faire un essai:
Aussi loin que je peux voir, c'est la façon dont les premiers devraient être trouvée,
pas avec un tamis (beaucoup plus rapide),
mais avec: la réponse est dans la question! Surprenant?
Vitesse? les nombres premiers < de 400 000 : moins de 10 secondes (sur ma montre, une rolex, je l'ai acheté sur le marché, le vendeur a dit que c'était un vrai, un vrai de vrai pour le prix de deux baguettes, avec 12 de vrais diamants).
Nous allons compter les nombres premiers (je ne vais pas vous montrer le code 😉 :
664579 nombres premiers < de 10 000 000 : 5 secondes.
Supprimé une précédente réponse (comme d'autres réponses), un premier crible.
J'espère obtenir mon prochain "Nécromancien" insigne bientôt.
J'ai demandé à l'auteur: Dans votre livre: "C++ pour les F&S"
est un exercice sur les nombres premiers,[xrcs]...[/xrcs].
Il y a sept ans, il a été demandé à l': DONC/q/5200879
Il y A quelques jours, j'ai donné une réponse: DONC/un/49199435
Pensez-vous que c'est une solution raisonnable, ou peut-être la solution.
Il a répondu: Peter, je n'ai jamais vraiment avoir une solution spécifique à l'esprit
quand je fais les exercices,
donc je ne peux pas dire que j'ai votre solution exacte à l'esprit.
La joie de C++, c'est que l'on peut venir avec vraiment des solutions créatives et grand code,
car, à première vue, il semble que vous avez fait.
Merci pour l'envoi!
M. Bronson
Je suis allé à https://youtu.be/1175axY2Vvw
PS. Un tamis: https://pastebin.com/JMdTxbeJ
Juste de l'essayer.
Il est facile, sans supplément de fonctions internes.
Essais par 2,3,5,7 est assez bon pour jusqu'à 120donc 100 est OK.
Il y a 25 nombres premiers ci-dessous 100un 30 ci-dessous 121 = 11*11.