ITパスポート 2022年 問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
🔒 解説は解答すると表示されます
関数checkDigitのチェックデジット計算【ITパスポート 解説】
正解の理由
配列(複数の値を順に並べて格納するデータ構造)originalDigitの各要素の合計をに入れます。手順(2)で「を10進の各桁の和にする」には、の10で割ったときの商(整数部分、以下「商」と表現します)をとし、1の位(余り)を取り出して両方を足せばよいです。1の位は式で表すと です。したがって新しいは
となり、これを実現している選択肢が イ です。例:ならで、となり、12はまだ9より大きいので繰り返してとなります。これで問題の手順と一致します。
解法ステップ
- は配列の各桁の合計(最大で9桁なので最大値は)を保持していると理解する。
- ループ内で を「を10で割った商(整数の部分)」として求める。これは十の位の数に相当する。
- 1の位は で求められる。
- 各桁の和は「十の位 + 一の位」なので、 とすればよい。
- これを になるまで繰り返す(ループは既にその条件になっている)。
(補足)式を整理すると と等価ですが、読みやすさの点で の形が分かりやすいです。
選択肢別の誤答解説
- ア: j ← j - 10 × k
- これは1の位(余り)だけを残す式です。例:でとの和は12ですが、この式だととなり、十の位を失います。よって誤りです。
- イ: j ← k + (j - 10 × k)
- 十の位()と一の位()の和を計算しており、手順どおりです。正解。
- ウ: j ← k + (j - 10) × k
- (j - 10) に k をかける不適切な式です。数値が大きく飛び、桁和にはなりません。例:だとになり意味が通りません。
- エ: j ← k + j
- 元のにさらに十の位を足す形で、値が増えてしまいます。桁ごとの和にするどころか大きくなるため誤りです。
よくある誤解
- 「商」と「余り」を混同する
- 商(しょう)は割り算で出る整数部分(10の位など)。余りは1の位。両方を使って桁を分ける点を押さえてください。
- 1回のループで必ず1桁になると考える誤り
- 例えば79 → 7+9 = 16 と2桁に残る場合があるため、条件どおり「9以下になるまで」繰り返す必要があります。
- 割り算が小数になると誤解する
- プログラム文では「÷10の商」とあるので整数商を取る(浮動小数点での割り算ではない)点を確認してください。
補足コラム
この手順は「各桁の和を繰り返して1桁にする」操作で、数学的にはデジタルルート(digital root)に関連します。デジタルルートは数を9で割った余りに関係します(ただし余り0は9に対応する場合があります)。本問では元の合計が0の場合は0がチェックデジットになりますが、通常の正数では繰り返し桁和を取ると1〜9の範囲に落ち着きます。実装上は、今回のように合計が最大81に収まるため、2回繰り返せば確実に1桁になります。
(簡単な実装例)
def check_digit(original_digit):
j = sum(original_digit) # 配列の各要素の合計
while j > 9:
k = j // 10 # 商(十の位)
j = k + (j - 10 * k) # 十の位 + 一の位
return j
FAQ
Q. 「j ← j - 9 × k」と書き換えてもよいですか?
A. はい。数学的には等価です。ただし式の意味(十の位と一の位を足す)が分かりやすい形で書くと理解しやすいです。
A. はい。数学的には等価です。ただし式の意味(十の位と一の位を足す)が分かりやすい形で書くと理解しやすいです。
Q. 配列の要素番号が1から始まることは考慮する必要がありますか?
A. 問題文では1始まりですが、実際の言語(例:Pythonは0始まり)ではインデックスに注意して実装してください。問題の擬似コードでは1始まりで正しいと考えてください。
A. 問題文では1始まりですが、実際の言語(例:Pythonは0始まり)ではインデックスに注意して実装してください。問題の擬似コードでは1始まりで正しいと考えてください。
Q. なぜループを使うのですか?1回で十分ではないですか?
A. 合計が2桁であり、その2桁の和が再び2桁になる場合があるため(例:79→16)、条件どおり9以下になるまで繰り返す必要があります。
A. 合計が2桁であり、その2桁の和が再び2桁になる場合があるため(例:79→16)、条件どおり9以下になるまで繰り返す必要があります。
関連キーワード: チェックデジット、桁和、デジタルルート、配列操作、商と余り、アルゴリズム入門

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

