アルゴリズムとプログラミング|令和4年度 ITパスポート試験 問78
関数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
解説
各桁を足すので、十の位であるkと一の位との和を入れます。
この関数は、配列に入った9桁ぶんの数字を全部足し、その合計が9より大きいあいだ、各桁の数字を足す操作をくり返して、9以下になった値をチェックデジットとして返します。合計は最大でも9が9個で81ですから、二桁を超えることはありません。プログラムの中でjを10で割った商をkとしているので、kはjの十の位そのものです。すると一の位は、jから10かけるkを引いた値になります。この二つを足したものが、桁を足し合わせた新しいjですから、空欄にはkとその差の和を入れることになります。式にすると、kにjから10かけるkを引いた値を足す形です。くり返しの条件はjが9より大きいあいだですが、この問では一度回れば必ず9以下になります。よって当てはまるのは、kにjと10かけるkの差を足す式です。
ほかの選択肢はなぜ違うのか
- jから10かけるkを引くだけの式です。これでは一の位しか残らず、十の位にあたるkが捨てられてしまいます。各桁の数字を合計するという手順の書き方に立ち返れば、二つとも足さなければならないことが分かります。手順の二番目が、各桁の数字を合計すると書いていることを読み直します。
- kにjから10を引いた値とkを掛けたものを足す式で、括弧の位置が違います。引き算をしてから掛けるのではなく、10とkを掛けてからjから引くのが正しい順で、この形では一の位が求まりません。
- kにjをそのまま足す式です。jには十の位の分がまだ含まれたままなので、十の位を二重に数えることになります。10かけるkを引いて一の位だけを取り出してから足す、という段取りが抜けています。
この問題に関係する言葉
- チェックデジット
- 配列
- 関数
出典:令和4年度 ITパスポート試験 問78(改変:原典の図表をテキストに書き起こした)
同じ単元をまとめて解くならアルゴリズムとプログラミングへ。
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)