令和4年度 ITパスポート試験 問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
- アj ← j - 10 × k
- イj ← k + (j - 10 × k)
- ウj ← k + (j - 10) × k
- エj ← k + j
正解:イ
解説
j は 2 桁以下の数なので,k=j÷10 の商は十の位の数字です。一の位の数字は j - 10×k で求められます。各桁の数字を合計するには,十の位 k と一の位 (j - 10×k) を足して j ← k + (j - 10 × k) とします。例えば j=38 なら,k=3,一の位は 38-30=8 で,新しい j は 3+8=11 となり,まだ 9 より大きいので while の繰返しが続き,次は 1+1=2 になります。
選択肢ごとの解説
- ア誤り。これでは一の位の数字だけが j に残り,十の位の数字 k が加算されません。
- イ正しい。十の位 k と一の位 (j - 10 × k) の合計が新しい j となり,各桁の数字の合計になります。
- ウ誤り。(j - 10) × k という計算は各桁の数字の合計の意味になりません。例えば j=38 では k+(38-10)×k=3+84=87 となってしまいます。
- エ誤り。k + j では,元の数 j をそのまま足してしまうので,各桁の数字の合計になりません(例えば j=38 では 41 となり,値が増えるため繰返しが終わりません)。