アルゴリズム(全18問中1問目)

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

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

出典:令和4年春期 問78

  • j ← j-10×k
  • j ← k+(j-10×k)
  • j ← k+(j-10)×k
  • j ← k+j
正解 問題へ
分野:テクノロジ系
中分類:アルゴリズムとプログラミング
小分類:アルゴリズムとプログラミング
while文に入ったときの変数 j には、for文の繰返し処理により〔手順〕(1)の結果、すなわち配列 originalDigit の要素番号1~9の要素の値を合計した値が格納されています。〔手順〕(2)によると、変数 j が9より大きい場合は、「合計した値を10進の整数で表現したときの各桁の数字を合計する」ことになっています。例えば j = 35 であれば、十の位の数字である3と一の位の数字の5の合計である8を変数 j に格納することになります。

プログラムを見ると空欄aの1行前では、k ← j ÷ 10の商という処理を行っています。これは変数 k に変数 j の十の位の数字を求める処理です。上記の例で言えば「35÷10=3 あまり 5」なので、kに3が格納されます(変数kは整数型なので小数点以下は切り捨てられます)。

次に解答群を見ると、空欄aは変数 j に代入する処理なので、変数 j の一の位の数字を求めてそれと変数 k (十の位の数字)とを足し合わせる処理をしなければならないことがわかります。2桁の数の一の位の数字を求めるには、

 35-30=5 → 35-3×10=5

というように、2桁の数からその十の位の数字×10を引くことによって実現でき、これを変数 k と変数 j を使って表すと「j-k×10」という式になります。十の位を表す式が k、一の位を表す式が j-k×10 なので、これを足し合わせている「イ」の式が適切とわかります。

【別解】
2桁であれば何の数字でも良いですが、変数 j に適当な値を当てはめてみて、正しい結果が得られるかどうかを見る方法でも解答を導くことができます。j=35のとき、新たな j は 3+5=8 なので、
  • j ← 35-10×3=5 となり、正しい結果が得られません。
  • j ← 3+(35-10×3)=8 となり、正しい結果となります。
  • j ← 3+(35-10)×3=78 となり、正しい結果が得られません。
  • j ← 3+35=38 となり、正しい結果が得られません。

Pagetop