2016-05-06 10 views
-3

アルゴリズムに合っていれば、出力は真でなければならず、そうでなければ出力は偽でなければならない。どこが間違っているのか?Luhnアルゴリズムが時には失敗することがある

私は一見total

1586455534096 ; output : false(fail) 

49927398716 ; output : true (ok) 

984697300577 ; output : false (fail) 

コード

#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

あなたが失敗例えばコードをデバッグしようとしたことがありますか? – MrSmith42

答えて

0

を試してみましたが初期化され、コードで初期化されていない値を持つことが不定値につながり、あなたがそれを使用する前に

+0

合計= 0を初期化すべきですか? –

0

あなたはtotalを初期化することはありませんこれは、その値が不確定であることを意味しますとgiあなたにはの定義されていない動作があります。他の変数と同じかもしれません。

たとえば、次のような宣言で変数を初期化します。

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

申し訳ありませんが、私はかなり理解していません。計算の前にtotal = 0を入れますか? –

+0

試しましたが、まだ失敗しました。 –

+1

@ M.H.F次に、デバッガを使用して、変数と値を監視しながら、いつどこでエラーが発生するかを確認しながら、コードを1行ずつステップ実行する必要があります。まず各ステップの値を知っている入力から始めて、簡単に確認することができます。 –

3

コードが機能しています。少なくとも

  • インナーしばらく
  • を条件として >0を使用する必要があり、合計VARため

    1. なしのinit値:あなたのコードに

      #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; 
      } 
      

      は、2つの主要な問題があります。あなたのコードの

    私の補正が

    #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; 
    } 
    
    関連する問題