2012-01-25 4 views
-1

Je dois trouver Les facteurs premiers de 13195 sont 5, 7, 13 et 29. /* Le plus grand est 377. */ Quel est le plus grand facteur premier du nombre 600851475143?Trouvez le plus grand facteur nombre premier?

#include<stdio.h> 
int main() 
{ 
    int i, j = 0; 
    /*Code works really fine for 13195 or 26*/ 
    long value, large = 600851475143 /*13195*/; 

    for(value = (large - 1) ; value >= 3; value--) 
    { 
     if(large % value == 0) 
     { 
      /*printf("I am here \n");*/ 
      if((value % 2 != 0) && (value % 3 != 0) && (value % 5 != 0) && (value % 7 != 0)) 
      { 
       j = 1; 
       break; 
      } 
     } 
    } 

    if (j == 1) 
    { 
     printf("%ld", value); 
    } 
    return 0; 
} 

Où cela ne va pas?

+1

"/ * Le plus grand est 377.*/"Pas correct,' 377 = 13 * 29' n'est pas un premier –

+0

mauvais état de rupture – BLUEPIXY

+0

combien de bits est long Votre numéro peut être hors de portée, vous avez besoin d'un int 64 bits – CashCow

Répondre

1
#include<stdio.h> 
//Euler problem #3 
int main(){ 
    long long i, sqi; 
    long long value, large = 600851475143LL; 
    long long max = 0LL; 

    i = 2LL; 
    sqi = 4LL; //i*i 
    for(value = large; sqi <= value ; sqi += 2LL * i++ + 1LL){ 
     while(value % i == 0LL){ 
      value /= (max=i); 
     } 
    } 

    if(value != 1LL && value != large){ 
     max = value; 
    } 
    if(max == 0LL){ 
     max = large; 
    } 
    printf("%lld\n", max); 
    return 0; 
} 
+0

Merci beaucoup ... Ça marche très bien –

+0

'// Problème d'Euler # 3' C'est vrai ..... –

+1

Je pensais que ces problèmes étaient destinés à donner aux programmeurs une soif de connaissance en mathématiques mais n'est-ce pas question de tristesse que certains d'entre eux essaient de le faire et de faire ressembler à une guerre qui peut être gagnée par tout moyen – maksbd19

2

600851475143 est probablement supérieure à la précision du type de données long de votre plateforme. Il faut au moins 40 bits pour stocker. Vous pouvez l'utiliser pour savoir combien de bits vous avez:

#include <limits.h> 

printf("my compiler uses %u bits for the long data type\n", (unsigned int) (CHAR_BIT * sizeof (long))); 
+1

ne pense pas à ce sujet .. – MByD

+0

-1 mais ce n'est pas et même si c'était l'algorithme n'est pas correct (ce code ne fonctionne pas non plus pour 72 (le facteur premier le plus élevé est 13 mais le code retournera 26) – Elemental

0

Vous devez ajouter un L comme suffixe à un nombre qui déborde MAX INT, donc cette ligne:

long value, large = 600851475143; 

devrait être:

long value, large = 600851475143L; 
//       ^
+0

BTW - il pourrait être un autre problème, mais c'est la première chose qui apparaît à mes yeux – MByD

+0

-1 ce n'est pas le principal problème avec le code - il ne fonctionne pas non plus 72 – Elemental

0

pour ce faire, vous devez établir que la valeur est le premier - à savoir ce qui est n'a pas de facteurs premiers.

Maintenant, votre petit morceau de code de vérification 3/5/7 n'est tout simplement pas assez bon - vous devez vérifier que la valeur a des facteurs premiers inférieurs (par exemple 11/13/17). D'un point de vue stratégique, si vous voulez utiliser cette analyse, vous devez vérifier la liste de tous les facteurs premiers que vous avez trouvés jusqu'à présent et vérifier par rapport aux trois premiers nombres premiers.

Une méthode plus simple (mais moins efficace) consisterait à écrire un IsPrimeFunction() et vérifier la primalité de chaque diviseur et stocker le plus grand.

3
  1. 600851475143 est trop grand pour tenir dans un entier de 32 bits. long peut être 32 bits sur votre ordinateur. Vous devez utiliser un type 64 bits. Le type de données exact dépendra de votre plate-forme, compilateur.

  2. Votre code de vérification principal est erroné. Vous supposez que si quelque chose n'est pas divisé par 2, 3, 5, 7, alors c'est primordial.

3

La chose la plus importante qui est mal est que votre code est trop lent: même si vous résoudre d'autres problèmes, comme l'utilisation d'un mauvais type de données pour vos entiers et essayer certains diviseurs qui sont certainement pas le premier , itératif par un de 10^11 ne finira tout simplement pas dans la vie de votre ordinateur est extrêmement gaspilleur.

Je vous recommande vivement read through the example on page 35 of this classic book, où Dijkstra vous emmène à travers le processus d'écriture d'un programme d'impression des 1000 premiers nombres premiers. Cet exemple devrait vous fournir suffisamment d'intuition mathématique pour accélérer vos propres calculs, y compris la partie où vous commencez votre recherche à partir de la racine carrée du nombre que vous essayez de factoriser.

+0

Si l'ordinateur peut faire 10^8 divisions par seconde , descendant de 10^11 prendra moins de 20 minutes, le problème cible moins de 2 heures.C'est un ordinateur éphémère, vous devriez chercher un meilleur vendeur –

+0

@DanielFischer Vous avez raison, j'ai pensé à la boucle intérieure qui essaie un autre 'SQRT (10^11)' possibilités (ce que l'OP a comme une instruction 'if' devrait être une boucle' for' passant par les diviseurs du candidat pour voir s'il est premier ou non), mais puisque cette boucle interne Je ne devais pas le compter dans mes estimations comme un autre multiplicateur de 10^5. J'ai fait une correction à ma réponse, merci! – dasblinkenlight

0
public class LargeFactor{ 

    public static void main(String []args){ 
    long num = 600851475143L; 
    long largestFact = 0; 
    long[] factors = new long[2]; 

    for (long i = 2; i * i < num; i++) { 
     if (num % i == 0) { // It is a divisor 
     factors[0] = i; 
     factors[1] = num/i; 

     for (int k = 0; k < 2; k++) { 
      boolean isPrime = true; 
      for (long j = 2; j * j < factors[k]; j++) { 
       if (factors[k] % j == 0) { 
        isPrime = false; 
        break; 
       } 
      } 
      if (isPrime && factors[k] > largestFact) { 
       largestFact = factors[k]; 
      } 
      } 
     } 
    } 
    System.out.println(largestFact); 
} 
} 

code ci-dessus utilise le fait que nous avons seulement besoin de vérifier tous les chiffres jusqu'à la racine carrée lors de la recherche des facteurs.

Questions connexes