Je suis en train de résoudre le problème 3 du projet Euler et j'ai écrit le code suivant qui me donne la bonne réponse LargestPrimeFactor public class {Projet Euler # 3 Java: Pourquoi compter jusqu'à la racine carrée pour trouver le plus grand facteur premier, plutôt que de compter à partir de la racine carrée?
public static boolean isPrime(int p) {
boolean isPrime = true;
for (int i = 2; i < p/2; i++) {
if (p % i == 0) {
return false;
}
}
return isPrime;
}
public static double largestPrimeFactor(long n) {
double factor = 0;
for (int j=1; j<Math.sqrt(n); j++) {
System.out.println("j is : "+ j);
if (n % j == 0 && isPrime(j)) {
factor = j;
}
}
return factor;
}
public static void main(String args[]) {
long limit = 600851475143L;
System.out.println(largestPrimeFactor(limit));
}}
Je me demandais wether c'est une bonne idée de commencer à 1 et augmenter vers la racine carrée, lorsque nous cherchons le plus grand facteur. J'ai donc essayé de changer la boucle for dans la méthode largerPrimeFactor (long n) pour démarrer à partir de la racine carrée de n et compter à rebours. Cependant maintenant je reçois une réponse incorrecte. Quelle est la raison pour ça?
public class LargestPrimeFactor {
public static boolean isPrime(int p) {
boolean isPrime = true;
for (int i = 2; i < p/2; i++) {
if (p % i == 0) {
return false;
}
}
return isPrime;
}
public static double largestPrimeFactor(long n) {
double factor = 0;
for (int j=(int)Math.sqrt(n); 1<j; j--) {
System.out.println("j is : "+ j);
if (n % j == 0 && isPrime(j)) {
factor = j;
}
}
return factor;
}
public static void main(String args[]) {
long limit = 600851475143L;
System.out.println(largestPrimeFactor(limit));
}}
vous cassez après avoir trouvé le premier facteur premier (puisque le premier est le plus grand et vous n'avez pas à chercher plus loin)? – Janar
Merci. C'était le problème! Mais cela a-t-il plus de sens de compter ou de décompter? – Miluleh
Pourquoi comptez-vous la racine carrée? Le plus grand facteur premier peut être plus grand. – Oleg