基本情報技術者試験 令和元年度 秋季 午前 問1
10 進数から 2 進数への変換についての問題。
--------------------------
令和元年度 秋期 午前 問1
次の流れ図は、10 進整数 j (0 < j < 100)を 8 桁の 2 進数に変換する処理を表している。2 進数は下位桁から順に、配列の要素 NISHIN(1)から NISHIN(8)に格納される。
流れ図の a 及び b に入れる処理はどれか。ここで、j div 2 は j を 2 で割った商の整数部分を、j mod 2 は j を 2 で割った余りを表す。
a | b | |
ア | j ← j div 2 | NISHIN(k) ← j mod 2 |
イ | j ← j mod 2 | NISHIN(k) ← j div 2 |
ウ | NISHIN(k) ← j div 2 | j ← j mod 2 |
エ | NISHIN(k) ← j mod 2 | j ← j div 2 |
--------------------------
解説
基本情報の過去問公開は令和元年の秋季までとのこと。
今後の問題も同じような傾向なのだろうか?
ひとまず過去問が参考になることは間違いないと思うので、令和元年秋季の 80 問も書いてみる(もう令和 3 年)。
平成 31 年度春期 80 問書くのにかかった期間を考えると、書き終わるのは 令和 6 年か。
まず、10 進数を 2 進数にするときの計算は以下の様になる。
例として 10 進数 26 を 2 進数にしてみる。
"2 進数は下位桁から順に、配列の要素 NISHIN(1)から NISHIN(8)に格納される"
とあるので、NISHIN(k)には j を 2 で割ったときの余りの数値が格納される。
選択肢には "NISHIN(k) ← j div 2" と "NISHIN(k)← j mod 2" の 2 パターンあるが、NISHIN(k)には j を 2 で割ったときの余りを格納しなければいけないので、"NISHIN(k)← j mod 2" となるべき。
なので、"NISHIN(k)← j div 2" となっている選択肢イと選択肢ウは除外される。
"NISHIN(k)← j div 2" では、NISHIN(k)に 2 進数ではありえない 0 , 1 以外の数値が格納されてしまう。
残るは選択肢アと選択肢エになる。
この差は、"NISHIN(k)← j mod 2" と "j ← j div 2" とでどちらを先にやるか、になる。
上の例( j = 26 のケース)で見ると、ループの最初( k = 1 )では NISHIN(1)に 26 を 2 で割った余り(= 0)を格納しなければいけないはず。
選択肢アは先に "j ← j div 2" なので、j = 13 と更新される。
その後に "NISHIN(k)← j mod 2" なので、NISHIN(1)が 13 mod 2 = 1 となってしまい合わなくなる。
10 進数から 2 進数への変換の例にあるように、最も下位の桁 NISHIN(1)には最初の j(= 26) の値を 2 で割った際の余りがはいらないといけないが、選択肢アではそうなっていない。
選択肢エは先に "NISHIN(k)← j mod 2" なので、NISHIN(1)が 26 mod 2 = 0 となる(変換の例と同じになっている)。
その後に "j ← j div 2" で j = 13 と更新され、ループがまわっていく。
ということで正解は選択肢エとなる。
この問題ではループが 8 回周り、NISHIN(1)から NISHIN(8)まであるので 8 桁の 2 進数までなら扱える。
8 桁の 2 進数で最大は 11111111 で、これを 10 進数にすると 255 になる。
問題だと "10 進整数 j (0 < j < 100)" と j の範囲が 100 未満ではあるが、255 までは正常に動く処理のはず。
むしろ、最大の j = 99 の場合でも 2 進数にすると 1100011 と 7 桁で収まるので、8 桁でなくてもよかったのでは?
前後の問題はこちら。