Test de nombres premiers très simple - Je ne comprends pas la boucle for
Je suis pratiquant passé les examens de base de java examen, et je trouve qu'il est difficile de faire une boucle for de travail pour tester si un nombre est premier. Je ne veux pas compliquer par l'ajout de mesures d'efficacité pour un plus grand nombre, juste quelque chose qui serait au moins de travail pour les 2 chiffres.
Au moment où il retourne toujours false, même si n EST un nombre premier.
Je pense que mon problème est que j'obtiens quelque chose de mal avec la boucle de lui-même et où mettre le "return true;" et "return false;"... je suis sûr que c'est une erreur fondamentale que je suis en train de faire...
public boolean isPrime(int n) {
int i;
for (i = 2; i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
La raison pour laquelle je ne pouvais pas trouver de l'aide ailleurs sur stackoverflow est parce que des questions similaires ont été pour demander une plus compliqué la mise en œuvre de disposer d'un moyen plus efficace de le faire.
source d'informationauteur BexLE
Vous devez vous connecter pour publier un commentaire.
Votre
for
boucle a un petit problème. Il doit être: -Bien sûr, vous ne voulez pas de vérifier le reste quand
n
est divisé parn
. Il vous donnera toujours0
.En fait, vous pouvez même réduire le nombre d'itérations par l'évolution de la condition de: -
i <= n /2
. Depuisn
ne peut pas être divisé par un nombre supérieur àn /2
sauf lorsque nous considéronsn
que nous n'avons pas à envisager.Vous pouvez changer votre
for
boucle pour: -Vous pouvez arrêter beaucoup plus tôt et passer à travers la boucle rapide avec:
Erreur est i<=n
Vous devriez écrire
i < n
parce que la dernière étape de l'itération va vous donnertrue
.Avec ce code nombre divisible par 3 sera ignoré pour la boucle de code d'initialisation.
Pour la boucle d'itération sera également ignorer les multiples de 3.
Vous pouvez également utiliser quelques calculs simples de la propriété dans votre boucle for.
Un nombre " n " sera un nombre premier si et seulement si elle est divisible par lui-même ou 1.
Si un nombre n'est pas un nombre premier il sera équipé de deux facteurs:
vous pouvez utiliser la boucle for pour vérifier jusqu'à la racine carrée du nombre " n " au lieu d'aller tout le chemin à 'n'. Comme si 'a' et 'b' sont supérieures à la racine carrée du nombre "n", a*b doit être supérieure à "n". Si au moins l'un des facteurs doit être inférieur ou égal à la racine carrée.
de sorte que votre boucle, pourrait être quelque chose comme ci-dessous:
En faisant cela vous permettrait de réduire considérablement le temps d'exécution de la complexité du code.
Je pense qu'il serait réduit à O(n/2).
L'un de la façon la plus rapide est en boucle que jusqu'à la racine carrée de n.
Vous êtes à la vérification de
i<=n
.Alors, quandi==n
vous obtiendrez 0 seulement et il retournera false toujours.Essayezi<=(n/2)
.Pas besoin de vérifier jusqu'ài<n
.La mentionnés ci-dessus algorithme traite 1 en tant que premier bien qu'il ne l'est pas.
Donc voici la solution.
Bien, pour la boucle a un problème. Voici le code,
Faire la Java 8 est plus agréable et plus propre