マナビングITパスポート

チェックデジット計算で各桁をどう足す?

ITパスポート試験 令和4年度 問78 / アルゴリズムとプログラミング › アルゴリズムとプログラミング

過去問にチャレンジ

令和4年度 問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年度 問78の図
  1. ア

    j ← j-10×k

  2. イ

    j ← k+(j-10×k)

  3. ウ

    j ← k+(j-10)×k

  4. エ

    j ← k+j

会話形式の解説

講師講師
空欄では、9個の数字の合計値を、さらに各桁に分けて足す処理を考えます。
受験者受験者
最初の合計と、空欄で求める合計は対象が違うのですね。
講師講師
はい。最初の繰返しで9個の数字を足し、その結果が9より大きい間、各桁を足し直します。
受験者受験者
合計値が2桁なら、10で割った商は十の位ですか。
講師講師
そのとおりです。元の値から商の10倍を引けば、一の位が残ります。十の位と一の位を足す式が正解です。
受験者受験者
例えば38なら、商が3で、38から30を引いた8が一の位ですね。
講師講師
はい。3と8を足す式なので、正解はイです。新しい値は11となり、まだ9より大きいため、もう一度足して2にします。
受験者受験者
元の値から商の10倍を引くだけの式では、8しか残りませんね。
講師講師
そのためアは不適切です。十の位の3も足す必要があります。
受験者受験者
元の値から10だけ引いて商を掛ける式も、一の位の求め方とは違いますね。
講師講師
はい。ウでは各桁の和になりません。商を元の値に足すエも、一の位を取り出していないので不適切です。
受験者受験者
商で十の位を求め、元の値から商の10倍を引いて一の位を求める、と確認できました。
講師講師
各桁を足した結果がまだ9より大きければ、同じ計算を繰り返します。

まとめ

正解はイです。10で割った商が十の位、元の値から商の10倍を引いた値が一の位になります。この二つを足し、結果が9以下になるまで繰り返します。

解答・解説

正解はイです

この問題のテーマ

10進数の各桁を足す処理を、商と一の位を使って表す問題です。

解き方の考え方

最初のfor文で、9個の数字の合計がjに入ります。while文では、jが9より大きい間、その各桁を足し直します。jは2桁以下なので、10で割った商kが十の位、j-10×kが一の位です。両者を足す式を選びます。

選択肢ごとの解説

  1. ×ア  j ← j-10×k
    「j-10×k」は一の位だけを残す式です。十の位を加えていないため、各桁の合計になりません。
  2. ○イ  j ← k+(j-10×k)
    「k+(j-10×k)」は、十の位と一の位を足します。例えばj=38なら、k=3、一の位は38-10×3=8なので、新しいjは3+8=11です。まだ9より大きいため、次に1+1=2として終了します。
  3. ×ウ  j ← k+(j-10)×k
    「(j-10)×k」は一の位を求める式ではありません。したがって、kを加えても各桁の合計にはなりません。
  4. ×エ  j ← k+j
    「k+j」は、元のjに十の位を加える式です。一の位を取り出して足す処理にはなりません。

補足

最初に求めるのは9個の数字の合計で、空欄で求めるのはその合計値の各桁の和です。計算の対象が切り替わる点に注意してください。

POINT

  • 10で割った商は、2桁の数の十の位を表します。
  • 元の数から商の10倍を引くと、一の位が得られます。
  • 各桁の和がまだ9より大きければ、同じ計算を繰り返します。

※出典:令和4年度 ITパスポート試験 問78(一部改変)