ITパスポート試験 / 令和4年度 ITパスポート試験 公開問題 / 問78
certification-simodake-work

令和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

  1. ア j ← j - 10 × k
  2. イ j ← k + (j - 10 × k) ✓ 正答
  3. ウ j ← k + (j - 10) × k
  4. エ j ← k + j

解説

この問題は、合計値 jj が2桁の数になったとき、その10の位と1の位を分解して足し合わせる処理を問うています。

手続きのポイントは、10進数における桁の抽出方法です。ある2桁の整数 jj があるとき、10の位は jj を10で割った「商」であり、1の位は jj を10で割った「余り」になります。

kk は問題文から k=j÷10k = j \div 10 です。 一方、10で割った余りは j(10×k)j - (10 \times k) と表現できます。 これらを足し合わせる必要があるため、計算式は k+(j10×k)k + (j - 10 \times k) となり、これが選択肢イに該当します。

アルゴリズムの考え方

プログラミングにおける数値計算の基本は、10進法の仕組みを演算子に落とし込むことです。今回のケースでは以下のルールを利用しています。

k=k = \text{商} (整数演算での除算) j(10×k)=余りj - (10 \times k) = \text{余り} (剰余演算)

この組み合わせは「桁を取り出す」ときや「各桁の数字を操作する」ときによく使われる手法です。例えば、大きな数の各桁をすべて足し合わせたい場合や、特定の桁だけを加工したい場合に、ループ処理と組み合わせて記述します。

試験での活用と応用

この種の問題は、擬似言語における数学的な処理能力を問うものです。特に「余り」を求める式(j10×kj - 10 \times k の部分)は、本来であれば j(mod10)j \pmod{10} という剰余演算子を使うのが一般的ですが、この問題のように算術演算だけで表現させることで、数値の構造を正しく理解しているかを確認してきます。

ITパスポート試験では、複雑なアルゴリズムに見えても、突き詰めれば「10進数の仕組み(位取り記数法)」に帰着する問題が頻出します。桁数が多い場合や、手順が繰り返される場合は、まず数値を具体的に当てはめて(例:j=15j = 15 なら k=1k = 1、余りは 55、合計 66 になるはずだ、といった検証)選択肢を削るのが確実な解き方です。

https://www.fe.jitec.go.jp/ https://www.ipa.go.jp/shiken/kubun/ip.html https://it-passport.biz/

学習の記録にははてなブックマーク!

気づいたこと・覚えたことをコメントにメモしよう