2016-05-06 5 views
-3

Wenn es den Algorithmus passt, sollte es eine Ausgabe von True haben und wenn dies nicht der Fall ist, sollte die Ausgabe falsch sein. Irgendeine Idee, wo es schief geht?Luhn Algorithmus manchmal arbeiten manchmal scheitern

Ich versuchte

1586455534096 ; output : false(fail) 

49927398716 ; output : true (ok) 

984697300577 ; output : false (fail) 

-Code

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
    char str[100]; 
    int n,num[100],prod[100],remainder,sum,total; 
    scanf("%s", str); 
    for(n=0;n<100;n++) 
    { 
     if(str[n]==0) break; 
     num[n] = str[n] - '0'; 
     if(n%2!=0) 
     { 
      prod[n]=num[n]*2; 
      sum=0; 
      while(prod[n]>=10) 
      { 
       remainder=prod[n]%10; 
       sum=sum+remainder; 
       prod[n]=prod[n]/10; 
      } 
      num[n]=sum; 
      } 
     total = total + num[n]; 
     } 
if(total%10==0) 
    printf("true\n"); 
    else 
    printf("false\n"); 
    return 0; 
} 
+0

Haben Sie versucht, den Code für eine versagende Beispiel zu debuggen? – MrSmith42

Antwort

0

Auf den ersten Blick total ist nicht initialisiert und in dem Code nicht initialisierten Werten führt zu unbestimmten Werte

+0

Soll ich total = 0 initialisieren? –

0

Sie nie total initialisieren, bevor Sie es verwenden , was bedeutet, dass sein Wert ist unbestimmt und gi Ving Sie undefined Verhalten. Könnte mit anderen Variablen identisch sein.

Initialisieren Sie die Variablen bei der Deklaration, wie z.

int n, num[100] = { 0 }, prod[100] = { 0 }, remainder = 0, sum = 0,total = 0; 
+0

Sorry, aber ich verstehe das nicht ganz. Setze ich vor irgendwelchen Berechnungen total = 0? –

+0

Versucht, aber immer noch fehlgeschlagen. –

+1

@ M.H.F Dann müssen Sie einen Debugger verwenden, um den Code Zeile für Zeile zu durchlaufen, während Variablen und Werte überwacht werden, um zu sehen, wann und wo es schief geht. Beginnen Sie mit einer Eingabe, die Sie * wissen * die Werte in jedem Schritt, so können Sie leicht überprüfen. –

3

Ihr Code funktioniert.

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
    char str[100]; 
    int n,num[100],prod[100],remainder,sum,total=0; 
    scanf("%s", str); 
    for(n=0;n<100;n++) 
    { 
     if(str[n]==0) break; 
     num[n] = str[n] - '0'; 
     if(n%2!=0) 
     { 
      prod[n]=num[n]*2; 
      sum=0; 
      while(prod[n]>0) 
      { 
       remainder=prod[n]%10; 
       sum=sum+remainder; 
       prod[n]=prod[n]/10; 
      } 
      num[n]=sum; 
      } 
     total = total + num[n]; 
     } 
if(total%10==0) 
    printf("true\n"); 
    else 
    printf("false\n"); 
    return 0; 
} 

in Ihren Code gibt es 2 Hauptprobleme:

  1. kein init Wert für Gesamt var mindestens
  2. die innere während haben >0 als Bedingung zu verwenden.

Meine Korrektur auf Ihren Code

#include<stdio.h> 
#include<stdint.h> 
#include<string.h> 

int main() 
{ 
    char format[32]; 
    char str[100]={0}; 
    uint32_t n=0; 
    uint32_t num = 0; 
    uint32_t total=0; 

    snprintf(format, sizeof(format), "%%%zus", (sizeof(str)/sizeof(str[0]))-1); 

    scanf(format, str); 

    while (str[n] != '\0') 
    { 
     num = str[n] - '0'; 

     if(n%2!=0) 
     { 
      num*=2; 
      while(num>0) 
      { 
       total += num%10; 
       num/=10; 
      } 
     } 
     else 
     { 
      total += num; 
     } 

     n++; 
    } 

    if(total%10==0) 
     printf("true\n"); 
    else 
     printf("false\n"); 

    return 0; 
}