前提・実現したいこと
<Luhnアルゴリズム>
入力されたある桁数の整数について、右から偶数番目の数を2倍し、もし2倍した結果が10以上であればその数の1の位と10の位を足す。
結果的にすべての位を合計した数の1の位が0であれば「true」、そうでなければ「false」を出力する。
また(1)入力された数が60桁を超える時 (2)入力に0~9以外の文字が含まれるとき
は「Error」を出力する。
includeしていいのは<stdio.h>のみとする。
例:入力→1234567
このとき1 + 4 + 3 + 8 + 5 + (1+2) + 7 = 31
よって出力→false
このプログラムで条件(1)を満たすような条件式が分かりません。
・Lは入力された整数の桁数、moji[]は入力された一文字一文字をそれぞれ格納するものです。
・2倍や足し算といった計算をする為にchar型の変数を一度「-'0'」を付け足しASCIIコードと対応させて行っています。
・inv関数は入力に数字以外が入っていないか判別するものです。入力がすべて数字であれば1,一文字でもabcといった文字が含まれていれば0を返します。(条件(2))
今まで大学からの課題などで入力を読み取るのにscanfを使ってきたので、このプログラムで初めてfgetsを使っています。
仮に60桁の数が入力された場合、fgets関数によりmoji[0]~moji[59]に数字、そしてmoji[60]に\0が入りmoji[61]以降は全て'\0'が格納されると考え、条件(1)を満たすような条件文を(moji[61]!='\0')としたのですが、入力する数が同じでもコンパイル毎に結果が変わってしまいます。
(合計の1の位が0ならtrueかErrorのどちらか、そうでないならfalseかErrorのどちらか)
条件(2)の判別をするinv関数は正しく機能しており、sumの値も問題ありません。
ただ実行結果が一定にならないということなのでおそらくmoji[61]!='\0'という条件文に問題があると思います。
fgets関数の理解が甘い上で質問させていただきますが、出力結果が一定になる条件文を探しています。m(__)m
発生している問題・エラーメッセージ
該当のソースコード
C
1#include <stdio.h> 2 3int L; 4 5int inv(int x[]) 6{ 7 int i,A; 8 9 for(i=0; i<L; ++i){ 10 if(x[i]<0 || x[i]>9){ 11 A=0; 12 break; 13 }else{ 14 A=1; 15 } 16 } 17 return A; 18} 19 20int main(void) 21{ 22 int i,num[100],c[100],sum=0; 23 char moji[100]; 24 25 fgets(moji,100,stdin); 26 27 for(i=0; i<100; ++i){ 28 if(moji[i]=='\0'){ 29 L=i-1; 30 break; 31 } 32 } 33 34 for(i=0; i<L; ++i){ 35 num[i]=moji[i]-'0'; 36 } 37 38 for(i=1; i<=L; ++i){ 39 c[i]=moji[L-i]-'0'; 40 } 41 42 if(inv(num)==0){ 43 printf("Error\n"); 44 }else{ 45 for(i=1; i<=L; ++i){ 46 if(i%2==0){ 47 c[i]=c[i]*2; 48 if(c[i]>9){ 49 c[i]=c[i]-9; 50 } 51 } 52 sum=sum+c[i]; 53 } 54 55 if(moji[61]!='\0'){ 56 printf("Error\n"); 57 }else if(sum%10==0){ 58 printf("true\n"); 59 }else{ 60 printf("false\n"); 61 } 62 } 63}
試したこと
条件(1)の対処としてmoji[61]!='\0'を適用してみました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー