令和元年度 秋期 午前 問1
アルゴリズム
流れ図のa及びbに入れる処理
次の流れ図は,10進整数 j(0<j<100)を8桁の2進数に変換する処理を表している。2進数は下位桁から順に,配列の要素 NISHIN(1) から NISHIN(8) に格納される。流れ図のa及びbに入れる処理はどれか。ここで,j div 2 は j を2で割った商の整数部分を,j mod 2 は j を2で割った余りを表す。
流れ図:
開始 ↓ j を入力 ↓ 変換 k:1, 1, 8(注) ← ループ端(始まり) ↓ a ↓ b ↓ 変換 ← ループ端(終わり) ↓ 終了
(注)ループ端の繰返し指定は,変数名:初期値,増分,終値 を示す。
選択肢は原典では a・b の2列の表。
- アa:j ← j div 2 / b:NISHIN(k) ← j mod 2
- イa:j ← j mod 2 / b:NISHIN(k) ← j div 2
- ウa:NISHIN(k) ← j div 2 / b:j ← j mod 2
- エa:NISHIN(k) ← j mod 2 / b:j ← j div 2
答えと解説を見る
✓ これが正解エa:NISHIN(k) ← j mod 2 / b:j ← j div 2
解説
割った余りを先に配列へ入れ、そのあとで半分にします。
10進数を2進数へ直す作業は、2で割るたびに出る余りを下の桁から順に並べることです。この流れ図の繰返しは、変数を1から8まで1ずつ増やしながら八回まわります。一回のなかでやることは二つあります。いまの値を2で割った余りを取り出して配列へ置くことと、いまの値そのものを2で割った商に置き換えることです。この二つには順序があり、余りのほうを先に取らなければなりません。置き換えを先に済ませてしまうと、すでに一つ上へずれた値から余りを読むことになります。すると最も下の桁が抜け落ち、並び全体が一つずつずれて入ります。八回まわり終えたとき、配列には下の桁から順に0と1が収まります。小さい数を二回ほど手で追うと、ずれ方の形はすぐ見えてきます。基数変換の問いは、順序を入れ替えた肢が必ず並ぶと思って読むと安全です。
ほかの選択肢はなぜ違うのか
- アa:j ← j div 2 / b:NI…:二つの操作そのものは正しく、置き換えるほうを先に書いた形です。最初の一周で下から一桁目を飛ばすため、答えは全体が一つ上へずれた並びになります。順序だけを入れ替えた肢は、この出題形式でほぼ必ず用意されます。順序が命です。
- イa:j ← j mod 2 / b:NI…:取り出した余りを、配列ではなく元の変数のほうへ戻しています。元の値が0か1になってしまうので、二周目から先はもう何も進みません。変数の中身が壊れる肢は、一周ぶん手で追えばその場で気づけます。止まる条件だけは満たします。
- ウa:NISHIN(k) ← j div …:配列へ置くものが、余りではなく商になっています。商は次の周へ送るための値であって、その桁の0と1を決める値ではありません。二つの記号がどちらの役目かを取り違えると、ちょうどこの形の誤りになります。名札の取り違えにあたります。
出典:令和元年度 秋期 基本情報技術者試験 午前 問1
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)