令和4年度 ITパスポート 問78(テクノロジ)
出典:令和4年度 ITパスポート試験 公開問題 問78(独立行政法人情報処理推進機構(IPA))
関数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
- アj ← j - 10 × k
- イj ← k + (j - 10 × k)
- ウj ← k + (j - 10) × k
- エj ← k + j
正解と解説を見る
正解:イ
【チェックデジットの手順】
まず9桁の数字を全て足します。その合計が9より大きい(2桁になる)場合は、合計の十の位と一の位の数字を足すことを、9以下になるまで繰り返します。
【プログラムの動き】
whileの中で、kには j ÷ 10 の商、つまり十の位の数字が入ります。一の位の数字は、j から 10 × k を引いた j - 10 × k です。各桁の数字の合計を新しいjにするので、空欄aは j ← k + (j - 10 × k) です。
【例で確かめる】
例えば、9桁の数字の合計が38のとき、次のようになります。
・1回目:k = 3(十の位)、一の位は 38 - 30 = 8、j = 3 + 8 = 11
・2回目:k = 1、一の位は 11 - 10 = 1、j = 1 + 1 = 2
jが9以下になったので終わり、チェックデジットは2です。
【選択肢の検討】
ア:j ← j - 10 × k では、一の位の数字だけが残り、十の位の数字が足されません。38なら8になってしまいます。
ウ:j ← k + (j - 10) × k では、38なら 3 + 28 × 3 = 87 となり、各桁の合計になりません。
エ:j ← k + j では、十の位の数字をjに足すだけで、jが大きくなり続けます。
よって、正解は選択肢イです。