令和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 ← k + (j - 10 × k)

この問題は、プログラムの ループ処理 と 各桁の数字の抽出 に関する理解を問うものです。

問題の要件とプログラムの対応

手順1の「配列 originalDigit の要素番号 1〜9 の要素の値を合計する」は、プログラムの前半にある for ループで実行され、変数 j に格納されています。配列は9桁であるため、合計値 j の最大値はすべての要素が 99 の場合の 9×9=819 \times 9 = 81 となり、プログラムの注釈にある通り「 j が2桁を超えることはない」ことがわかります。

手順2の「合計した値が 99 より大きい場合は、各桁の数字を合計する」処理は、後半の while (j が 9 より大きい) のループで実行されます。空欄 a には、2桁の整数 j の 十の位 と 一の位 を足し合わせ、新しい j として更新する処理が入ります。

空欄の処理の特定

  1. ループ内の k ← j ÷ 10 の商 によって、j の 十の位 の数字が変数 k に格納されます。
  2. 次に j の 一の位 を求めます。元の j から「十の位の値に 1010 を掛けた値」を引けばよいので、一の位は j - 10 \times k と表せます。
  3. 新しい j は「十の位」と「一の位」の合計なので、k + (j - 10 \times k) となります。
    これを j に代入する イ の j ← k + (j - 10 \times k) が正解です。

各選択肢の解説

  • ア:j ← j - 10 \times k は、j の一の位のみを新しい j に代入する式であり、各桁の合計になっていないため誤りです。
  • イ:正解です。十の位(k)と一の位(j - 10 \times k)を足し合わせています。
  • ウ:j ← k + (j - 10) \times k は、一の位を求める計算式として誤っており、正しい各桁の和が得られないため誤りです。
  • エ:j ← k + j は、十の位の数字を元の数 j にそのまま足してしまっているため誤りです。

Spineチーム