Ceci est ma méthode isPrime
:
private static boolean isPrime(int num) {
if (num % 2 == 0) return false;
for (int i = 3; i * i < num; i += 2)
if (num % i == 0) return false;
return true;
}
Je mets isPrime(9)
et il retourne true
. Quel est le problème avec la méthode?
Votre condition devrait être i * i <= num
private static boolean isPrime(int num)
{
if (num == 2)
return true;
if (num < 2 || num % 2 == 0)
return false;
for (int i = 3; i * i <= num; i += 2)
if (num % i == 0)
return false;
return true;
}
Vous n'avez pas pris le numéro 9 dans votre examen, donc 9 <9 donneront faux Mais vous devez vérifier 9.
mon échantillon:
public boolean isPrime(int x) {
if (x==1) {
return true;
} else {
for(int i=2;i<=Math.sqrt(x);i++) {
if (x%i==0) return false;
}
return true;
}
Java 8: (exemple avec expression lambda et flux)
public static boolean isPrimeFunctionalStyle(int number) {
return number > 1 &&
IntStream.rangeClosed(2, (int) Math.sqrt(number))
.noneMatch(i -> number % i == 0);
}
(Tardif) Sidenode:
private static boolean isPrime(int num) {
if (num % 2 == 0) return false;
for (int i = 3; i * i < num; i += 2)
if (num % i == 0) return false;
return true;
}
Ce code est manquant 2
; 2
est un nombre premier. Tout ce qui est divisible par 2
ne l’est pas, sauf le 2
- alors, utilisez:
private static boolean isPrime(int num) {
if (num == 2) return true;
if (num % 2 == 0) return false;
for (int i = 3; i * i < num; i += 2)
if (num % i == 0) return false;
return true;
}
Voici quelques astuces:
Le bogue principal est que vous ne vérifiez jamais la divisibilité par sqrt(num)
en raison d'une erreur dans la boucle.
L'autre bogue est que vous ne considérez pas 2
comme étant premier (ce qui est le cas).
Changez votre code comme ceci (condition de vérification):
private static boolean isPrime(int num) {
if (num == 2) return true;
if (num % 2 == 0)
return false;
for (int i = 3; i * i <= num; i += 2)
if (num % i == 0) return false;
return true;
}
for (int i = 3; i * i < num; i += 2)
if (num % i == 0) return false;
i * i
est 9, et 9 sur 9, donc la boucle for n'est pas exécutée.
vous pouvez simplement utiliser l'instruction if et else pour vérifier si le nombre est premier. Il existe un motif, tous les nombres sont des multiples de 2 ou 3 une fois que votre nombre atteint certaines limites.
public static boolean isPrime2 (int n)
{
if (n == 1) {
return false;
} else if (n == 2 || n==3) {
return true;
} else if (n>2) {
if(n % 2 ==0 || n % 3 == 0) {
return false;
}
}
return true;
}
public static boolean isPrime (int number) {
if(number < 2) {
return false;
}
int check = (int) Math.sqrt(number);
for(int i = 2; i <= check; i++) {
if(number % i == 0) {
return false;
}
}
return true;
}
la condition de boucle avec i * i < num
devrait être i * i <= num
la boucle n'est jamais exécutée, elle retourne donc directement vrai
La boucle ne court pas. Il se termine à la toute première valeur de i car 3 x 3 = 9it ne remplit pas la condition i * i <n