A型システムエンジニアの勉強メモ

情報処理試験の午前問題をネタにして、解説をじっくり書きながら勉強しています。基礎は大事。

広告

基本情報技術者試験 令和元年度 秋季 午前 問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 で割った余りを表す。

 

f:id:koki2016:20210731182519p:plain

 

  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 進数にしてみる。

 

f:id:koki2016:20210801133810p:plain

 

"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 桁でなくてもよかったのでは?

 

 

 

前後の問題はこちら。

koki2016.hatenadiary.com