2010-06-27 8 views
0

Je viens d'écrire une procédure pour décomposer un entier non signé en nombres premiers. cela fonctionnera normalement si je définis le type de données comme "int", si je le change en "long", le résultat sera faux. Je ne sais pas pourquoi.type entier long et division

BTW, j'ai utilisé Win-TC comme mon compilateur.

code comme ci-dessous:

#include "stdio.h" 
#define True 0xff 
#define False 0x00 
char DividerIsPrime(unsigned long data); 
void CheckIfDataCanBeExtracted(unsigned long data); 
main() 
{ 
    unsigned long data; 
    printf("please input data:"); 
    scanf("%d",&data); 
    printf("\n%d=",data); 
    CheckIfDataCanBeExtracted(data); 
// printf("%d",sizeof(short)); 
    getch(); 
} 

void CheckIfDataCanBeExtracted(unsigned long data) 
{ 
    unsigned long divider,temp,data1; 
    data1=data; 
    for(divider=2;divider<=data;divider++) 
    { 
     temp=data1%divider; 
     if(temp) {continue; } 
     if(DividerIsPrime(divider)) { 
     data1 = data1/divider; 
     printf("%d",divider); 
     if(data1==1) break; 

     else {printf("*"); divider--;} 


     } 
    } 
    return; 

} 

/* Check if this number is a prime number */ 
char DividerIsPrime(unsigned long data) 
{ 
    unsigned long divider; 
    char status=True; 
    for(divider=2;divider<data;divider++) 
    { 
     if(data%divider) status=True; 
     else status=False; 
    } 
    return status; 
} 

Merci pour l'aide de Paul, je sais où est faux. % d devrait être remplacé par% ld.

+1

Quel est le résultat? Comment est-ce mal? – djna

+0

d'abord, s'il vous plaît formater votre code correctement, c'est à peine lisible. alors n'utilisez pas 'char' comme valeurs de vérité, en C89 vous devriez toujours utiliser' int' et pas de constantes fausses: je n'ai jamais vu personne utiliser 255 pour true, wow. Mais pour arriver au point, vous ne nous avez pas dit quoi et comment cela échoue. –

+0

Si je saisis data = 4, alors output4 = 2 * 2 * 3 * 1597 * -21753; J'imprime le data1/divider, son résultat est un nombre négatif ... mais je l'ai défini comme "unsigned". –

Répondre

1

Votre fonction DividerIsPrime, comme il est actuellement écrit, a le défaut que, logiquement, il doit toujours retourner True.

La raison en est que le statut est modifié à chaque itération. Même si status=False est atteint (le nombre est composé car le module est sorti nul pour un diviseur), alors les itérations continueront et dans tous les cas, status=True sera atteint sur l'itération finale quand divider == (data - 1) .

Vous pouvez modifier cela comme suit:

/* Check if this number is a prime number */ 
char DividerIsPrime(unsigned long data) 
{ 
    unsigned long divider; 
    for(divider=2;divider<data;divider++) 
    { 
     if (0==(data % divider)) 
      return False; 
    } 

    return True; 
} 

Vous auriez trouvé cela avec une certaine « test unitaire », comme:

assert(DividerIsPrime(5)); 
assert(!DividerIsPrime(6)); /* This test would fail without corrected code. */ 

Évidemment, il y a des algorithmes beaucoup plus efficaces pour « tests de primalité ".

+1

Cependant, ce défaut aurait dû être apparent avec ints. Je me demande pourquoi l'affiche pensait que la différence int/long était importante. – djna

+0

J'ai changé la fonction que vous avez mentionnée. mais le résultat des queues échoue. –

+0

Comprenez-vous comment la fonction d'origine était incorrecte et pourquoi? On dirait que vous ne prenez que ma parole pour la vérité. –

Questions connexes