過去問解きまくり研究所 ホーム

令和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 × 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倍する式でなければ桁の重みが付きません。

ほかの選択肢はなぜ違うのか

出典:令和6年度 基本情報技術者試験 科目B 問2

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)