跳到正文

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

出典 令和4年度 ITパスポート試験 問78
解説

問 78

  • 错误ア

    j ← j − 10 × k 只保留个位数字(j 除以 10 的余数),把十位 k 丢弃了。若 j = 81 则得到 1,得不到本应的数字和 9,因此错误。

  • イ

    正解 while 循环负责「当合计值 j 大于 9 时,把 j 替换为其各位数字之和」的处理。根据注释,j 不会超过 2 位,所以循环中的 j 是 2 位整数。k ← j ÷ 10 的商 是十位上的数字,个位上的数字则由 j − 10 × k(即 j 除以 10 的余数)求得。因此各位数字之和为「十位 + 个位」= k + (j − 10 × k),把它赋值给 j 即可。例如当 j = 81 时,k = 8,个位 = 81 − 80 = 1,和 = 8 + 1 = 9,此时小于等于 9,于是退出循环,正确返回返回值 9。因此「イ」恰当。

  • 错误ウ

    j ← k + (j − 10) × k 这个式子的结构与数字和无关。当 j = 81、k = 8 时,8 + (81 − 10) × 8 = 8 + 568 = 576,变得非常大,无法收敛到 9 以下,因此错误。

  • 错误エ

    j ← k + j 只是把十位 k 加到原来的 j 上,并不是各位数字之和。当 j = 81、k = 8 时会变成 89,反而增大,导致循环无法收敛,因此错误。

ここがポイント
  • 对于 2 位整数,十位可用「÷ 10 的商」取出,个位可用「除以 10 的余数(= 原数 − 10 × 商)」取出。数字和就是这两者之和。
  • 校验位(把各位数字之和反复相加,直到变成 1 位)的思路,以及对伪代码中 while 循环、整数除法(商)的读取。
用語
解答問78イ
练这一题

作答记录