令和6年度 科目B 問2
アルゴリズム
擬似言語に関する問題
次のプログラム中の[ ]に入れる正しい答えを,解答群の中から選べ。
関数convDecimalは,引数として与えられた,“0”と“1”だけから成る,1文字以上の文字列を,符号なしの2進数と解釈したときの整数値を返す。例えば,引数として“10010”を与えると18が返る。
関数convDecimalが利用する関数intは,引数で与えられた文字が“0”なら整数値0を返し,“1”なら整数値1を返す。
〔プログラム〕
○整数型: convDecimal(文字列型: binary)
整数型: i, length, result ← 0
length ← binaryの文字数
for (i を 1 から length まで 1 ずつ増やす)
result ← [ ]
endfor
return result- アresult + int(binary の (length - i + 1)文字目の文字)
- イresult + int(binary の i文字目の文字)
- ウresult × 2 + int(binary の (length - i + 1)文字目の文字)
- エresult × 2 + int(binary の i文字目の文字)
答えと解説を見る
✓ これが正解エresult × 2 + int(binary の i文字目の文字)
解説
左の桁から順に、結果を2倍して次の桁の値を足す式です。
2進数の文字列を整数に直すときは、桁ごとの重み(右端から1、2、4、8…)を掛けて足すのが基本です。このプログラムはiを1からlengthまで増やすので、文字列を左端の1文字目から順に読みます。軸になるのは、左から読む場合に重みをどう付けるかです。左から読むときは、それまでの結果を2倍して桁を一つ左へずらし、そこへ今の文字の値を足していけば、最後に正しい重みがそろいます。
例の“10010”で追います。resultは0から始まります。i=1で1文字目は“1”なので 0 × 2 + 1 = 1。i=2は“0”で 1 × 2 + 0 = 2。i=3は“0”で 4。i=4は“1”で 4 × 2 + 1 = 9。i=5は“0”で 9 × 2 + 0 = 18 となり、問題文の例の18と一致します。
したがって空欄には result × 2 + int(binary の i文字目の文字) が入ります。最初に読んだ“1”は、その後4回2倍されるので16の重みをもつことになり、桁の重みを掛けて足す計算と同じ結果になります。
見分け方は、文字列を読む向きと2倍の有無の二つを確かめることです。iで左から読むなら、繰返しのたびに2倍する式でなければ桁の重みが付きません。
ほかの選択肢はなぜ違うのか
- アresult + int(binary …:result + int(binary の (length - i + 1)文字目の文字) は、右端から1文字ずつ値を足すだけで2倍がありません。“10010”では1が2個なので2が返り、18になりません。
- イresult + int(binary …:result + int(binary の i文字目の文字) は、左から読んでも位取りを反映しないため、“1”の個数を数えるだけになります。“10010”では2が返り、例の18と食い違います。
- ウresult × 2 + int(bin…:result × 2 + int(binary の (length - i + 1)文字目の文字) は、右端から読みつつ毎回2倍するので、文字列を逆順にした2進数の値になります。“10010”は“01001”として扱われ、9が返ります。
出典:令和6年度 基本情報技術者試験 科目B 問2
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)