プログラミングに関する問題です。
このようなアルゴリズムの理解力を問う問題では、トレースをしていくことが重要です。
その際、実際にダミーデータを入れてトレースをしていきましょう。
ここではダミーデータとして、「453628473」を用意します。
まずは各桁を合計します。
アルゴリズムの通りに合計していくと、変数jは順に、
4
4 + 5 = 9
9 + 3 = 12
12 + 6 = 18
18 + 2 = 20
20 + 8 = 28
28 + 4 = 32
32 + 7 = 39
39 + 3 = 42
と値が増えていき、最終的には42が代入されます。
42は9より大きい数字なので、while文内の処理が実行されます。
この処理は最終的に9より小さくならなくてはなりません。
またこのケースでのチェックディジットの条件として各桁の数字を合計とあるので、42ですと4 + 2で6になる必要があります。
コードには
k ← j ÷ 10の商
[ a ]
とあり、データを10で割った後の値を変数kに退避しています。
そのデータをどうするのかが問われています。(空欄a)
ここで各選択肢の計算を行った場合、どれが正しい値になるのかを検証していきます。
この時点で、
変数j には 42
変数kには 42 ÷ 10 = 4により4
が代入済みです。
以降、選択肢の「←」より右部分の式については、jやkをこの値で読み替えてください。
1
42 – 40 で2となり、9より小さいですが数値が正しくないので誤りです。
(正しい値は6です。)
2
4 + (42 – 10 × 4)
= 4 + (42 - 40)
= 4 + 2
= 6
となり、正しい結果となります。
3
1回目のループ
4 + (42 - 10) × 4
= 4 + 32 × 4
= 4 + 128
= 132
9より小さいという条件を満たさないので2回目突入
4 + (132 - 10) × 4
= 4 + 122 × 4
= 4 + 488
= 492 ←値が小さくなるどころか大きくなっている?
以下、さらに値が大きくなり無限ループとなります。
4
4 + 42 = 46
4 + 46 = 50
4 + 50 = 54…と、これも無限ループになります。
■参考
C言語で実際にプログラムを書くと次のようになります。
開発環境を整えられる人は実際にプログラムを書いたり改変してみたりすると、より理解が深まるでしょう。
#include<stdio.h>
int main(){
int originalDigit[9];
int i,j,k;
/*
9桁の整数の各桁を上位から入力
※設問のプログラムにはない部分です。
*/
for(int x = 0;x < 9;x++){
printf("%d番目の値を入力してください > ",x + 1);
scanf("%d",&originalDigit[x]);
}
j = 0;
/*
各桁を合計する部分
設問では「iを1からoriginalDigitの要素数まで1ずつ増やす」と
記載されています。
*/
for(i = 0;i < 9;i++){
j = j + originalDigit[i];
}
/*9より大きい場合に実行される、更なる桁どおしの計算*/
while(j > 9){
k = j / 10; /*10真数9桁の場合、jが2桁をこえることはない*/
j = k + (j - 10 * k);
}
printf("チェックディジットは%dです。",j);
return j;
}