ITパスポート試験

問78

ITパスポート過去問 令和4年度(2022年)問78

関数checkDigitは,10進9桁の整数の各桁の数字が上位の桁から順に格納された整数型の配列originalDigitを引数として,次の手順で計算したチェックデジットを戻り値とする。プログラム中のaに入れる字句として,適切なものはどれか。ここで,配列の要素番号は1から始まる。

〔手順〕

  • (1) 配列originalDigitの要素番号1~9の要素の値を合計する。
  • (2) 合計した値が9より大きい場合は,合計した値を10進の整数で表現したときの各桁の数字を合計する。この操作を,合計した値が9以下になるまで繰り返す。
  • (3) (2)で得られた値をチェックデジットとする。

選択肢

  • j ← j - 10 × k
  • j ← k + (j - 10 × k)
  • j ← k + (j - 10) × k
  • j ← k + j

正解と解き方・学習ポイント(AI解説)

正解:
あなたの回答:未回答

このプログラムは、まず配列originalDigitの9個の値を合計してjに入れます。次にjが9より大きい間、jを10の位と1の位に分解して、その合計に更新します。ここでkは「j ÷ 10の商」であり10の位の数字です。1の位の数字は、jから10の位の値(10 × k)を引いた j - 10 × k で求まります。したがって、各桁の数字の合計は k + (j - 10 × k) となり、aにはこの式を代入する文が入ります。

不正解
正解
不正解
不正解

Point

この問題は、擬似言語の処理を読み取り、2桁の整数を十の位と一の位に分解して各桁の和を求める式を選べるかを確認しています。

解くために必要な知識

この問題を解くには、繰り返し処理(while)と、整数の割り算の商を使った「10の位・1の位」の分解が必要です。

用語の整理

用語名 意味
チェックデジット 入力ミスなどの検出のために付加する検査用の数字です。
割り算の結果のうち、整数部分です。例:27 ÷ 10 の商は2です。
各桁の和 数を10進表現したときの各桁の数字を足した値です。

2桁の整数を各桁に分ける方法

2桁の整数jに対して、次のように求めます。

10の位

  • k = j ÷ 10 の商

1の位

  • 1の位 = j - 10 × k

各桁の和

  • 各桁の和 = k + (j - 10 × k)

このプログラムで2桁の分解で足りる理由

originalDigitは9個の数字(0~9)なので、合計jの最大値は次の通りです。

  • 最大値 = 9 + 9 + ... + 9(9個)

  • 最大値 = 9 × 9

  • 最大値 = 81

よってjは2桁(0~81)に収まるため、10の位と1の位に分解して足すだけで、手順(2)の「各桁の数字を合計する」を実現できます。

問題の解法手順

問題の注目点は、9桁の各桁は0~9なので合計jは最大でも81になり、jが常に2桁以下であることです。よって、手順(2)の「各桁の数字を合計する」は、2桁のときは10の位と1の位を足す処理になります。

解く手順

1. 変数の意味を確認する

  • jは、配列の合計値(または各桁和で更新された値)です。

  • kは、k ← j ÷ 10 の商 で求めた値で、jの10の位の数字です。

2. 1の位を式で表す

2桁の数jは、次の形で表せます。

  • j = 10 × k + (1の位)

したがって1の位は次です。

  • 1の位 = j - 10 × k

3. 各桁の合計(10の位 + 1の位)を作る

  • 新しいj = k + (j - 10 × k)

よってaには、次の代入文が入ります。

  • j ← k + (j - 10 × k)

まとめ

このプログラムは、まず配列originalDigitの9個の値を合計してjに入れます。次にjが9より大きい間、jを10の位と1の位に分解して、その合計に更新します。ここでkは「j ÷ 10の商」であり10の位の数字です。1の位の数字は、jから10の位の値(10 × k)を引いた j - 10 × k で求まります。したがって、各桁の数字の合計は k + (j - 10 × k) となり、aにはこの式を代入する文が入ります。

テクノロジ系 > 基礎理論 > アルゴリズムとプログラミング