本文へスキップ

令和4年度 ITパスポート試験 問78

この問題の解説と、これまでの解答の記録です。

問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

出典 令和4年度 ITパスポート試験 問78
解説

問 78

  • 不正解ア

    j ← j − 10 × k は一の位の数字 (j を 10 で割った余り) だけを残し、十の位 k を捨ててしまう。j = 81 なら 1 となり、本来の桁和 9 にならないため誤り。

  • イ

    正解 while ループは「合計値 j が 9 より大きい間、j を各桁の数字の和で置き換える」処理を担う。コメントより j は 2 桁を超えないので、ループ中の j は 2 桁の整数。k ← j ÷ 10 の商 は十の位の数字であり、一の位の数字は j − 10 × k (すなわち j を 10 で割った余り) で求まる。したがって各桁の和は「十の位 + 一の位」= k + (j − 10 × k) となり、これを j に代入すればよい。例として j = 81 のとき k = 8、一の位 = 81 − 80 = 1、和 = 8 + 1 = 9 となって 9 以下になりループを抜け、正しく戻り値 9 を返す。よって「イ」が適切。

  • 不正解ウ

    j ← k + (j − 10) × k は式の構造が桁和と無関係。j = 81、k = 8 では 8 + (81 − 10) × 8 = 8 + 568 = 576 と巨大になり、9 以下に収束しないため誤り。

  • 不正解エ

    j ← k + j は十の位 k を元の j に足すだけで各桁の和になっていない。j = 81、k = 8 では 89 と増えてしまい、ループが収束しないため誤り。

ここがポイント
  • 2 桁の整数について、十の位は「÷ 10 の商」、一の位は「10 で割った余り (= 元の数 − 10 × 商)」で取り出せる。桁和はこの両者の和。
  • チェックデジット (各桁の和を 1 桁になるまで繰り返す) の考え方と、擬似言語の while ループ・整数除算 (商) の読み取り。
用語

解答の記録