web-dev-qa-db-fra.com

Quel est le problème avec ma méthode isPrime?

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?

11
usama8800

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.

35
Tareq Salaheldeen

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;
}
5
K.Hayoev

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);
}
3
d.danailov

(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;
}
2
dognose

Voici quelques astuces:

  1. Le bogue principal est que vous ne vérifiez jamais la divisibilité par sqrt(num) en raison d'une erreur dans la boucle.

  2. L'autre bogue est que vous ne considérez pas 2 comme étant premier (ce qui est le cas).

2
NPE

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;
  }  
2
Sujith PS
 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.

0
Student

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;
}
0
Benjamin Zheng
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;
}
0
Ankush

la condition de boucle avec i * i < num devrait être i * i <= num

0
LynxZh

la boucle n'est jamais exécutée, elle retourne donc directement vrai

0
JosefN

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

0
Duleeka Gunatilake