クレジットカード番号に誤りがないか確認するため,Luhnアルゴリズムが用いられている.このアルゴリズムは,入力された番号が「正しい」か「間違っている」かを,以下の手順で求める.

  1. 右端から数えて偶数番目の数字をすべて2倍する
  2. 1.の計算の後,すべての数字の総和を求める.ただし,1.の処理で数字が2桁になった場合は,1桁目と2桁目の数字を足す.
  3. 求めた総和の1の位が0であれば「正しい」,そうでなければ「間違っている」と判定する

例えば,49927398716という番号が入力されたとき,

Luhnアルゴリズムの動作例

これより$70$が求まり,1の位が0であるため,このカード番号は「正しい」と判定される.


問題


標準入力より60桁までのカード番号を読み取り, Luhnアルゴリズムで正当性を検証し,正しければtrue,間違っていればfalseと標準出力に書き出すプログラムを作成せよ.

ただし,プログラムは以下の仕様を満たすこと.

  1. 入力される整数$x$が$1$文字以上$60$文字以下を受理し,それ以外の入力の場合は,Errorと表示して終了する.
  2. 入力される整数$x$が$0$より小さい値の場合や,$0$から$9$までの10文字以外の文字が代入された場合は,Errorと表示して終了する.
  3. 各表示は標準出力に出力し,それぞれ末尾には改行文字\nを付けること.
  4. 入力を保持するメモリ領域は,100文字文を超えて確保することは不可とする.
  5. #include していいのは <stdio.h>のみとする.

実行例


#は標準入力,>は標準出力を表す.

# 49927398716
> true
# 49927398714
> false
# 1982049058395830128494
> true

手順例


問題を分解して考える.

  1. 標準入力から整数$x$を読み込む
  2. 入力された数字を各桁ごとに処理
  3. 各桁の値の総和を計算する,ただし,右から数えて偶数の桁は値を2倍する
  4. $x_{i+1}$ を出力

0. 準備


1. 標準入力から整数$x$を読み込む

int main()
{
  int xxx;
  scanf("%d", &xxx);
...
}
文字列(文字の配列)の扱い
char str[100];
scanf("%s", str);
...
if (fgets(str, 100, stdin) == NULL) {
    // エラー処理
}
...

2. 入力された数字を各桁ごとに処理

for(i=0;i<100;++i){
  if(str[i] == '\0'){
    break;
  }
}

3. 各桁の値の総和を計算する,ただし,右から数えて偶数の桁は値を2倍する

  v = str[i] - '0';

ヒント