関数checkDigitは,10進9桁の整数の各桁の数字が上位の桁から順に格納された整数型の配列originalDigitを引数として,次の手順で計算したチェックディジットを戻り値とする。
プログラム中のaに入れる字句として,適切なものはどれか。
ここで,配列の要素番号は1から始まる。
〔手順〕
(1) 配列originalDigitの要素番号1〜9の要素の値を合計する。
(2) 合計した値が9より大きい場合は,合計した値を10進の整数で表現したときの各桁の数字を合計する。
この操作を,合計した値が9以下になるまで繰り返す。
(3) (2)で得られた値をチェックディジットとする。
〔プログラム〕
○整数型: checkDigit(整数型の配列: originalDigit)
整数型: i, j, k
j ← 0
for (i を 1 から originalDigitの要素数 まで 1 ずつ増やす)
j ← j + originalDigit[i]
endfor
while (j が 9 より大きい)
k ← j ÷ 10 の商 /* 10進9桁の数の場合,jが2桁を超えることはない */
a
endwhile
return j
正答2
解説
正解は2です。
9桁の数字の合計を、1桁になるまで各桁の数字の合計に置き換えてチェックディジットを求めるプログラムの空欄を補う問題です。
プログラムでは、まずforループで全要素を合計してjに入れます。
次にwhileループで、jが9より大きい間、jの十の位と一の位を足した値でjを置き換えます。
k←j÷10の商で、kにはjの十の位の数字が入ります。
【計算】
jの一の位の数字は、j-10×kで求められます。
したがって、十の位と一の位の合計は、k+(j-10×k)です。
例えば各桁の合計j=45のとき、k=45÷10の商=4です。
一の位は45-10×4=5なので、新しいjは4+5=9です。
jが9以下になったので、whileループを抜けて9を返します。
【選択肢別解説】
1:× j-10×kは一の位の数字だけです。
j=45なら5になり、十の位の4が足されないので手順(2)と異なります。
2:○ 十の位kと一の位(j-10×k)を足すので、手順(2)の「各桁の数字を合計する」処理と一致します。
3:× k+(j-10)×kは、j=45なら4+35×4=144となり、各桁の合計になりません。
4:× k+jは、j=45なら4+45=49となり、jが大きくなる一方です。
jが9以下にならず、ループが終わりません。
【ポイント】
整数の十の位は「÷10の商」、一の位は「÷10の余り(j-10×商)」で取り出せます。
この考え方はアルゴリズム問題で頻繁に使われます。