
問題の考え方(2進数 → 10進数があまり分からない場合)
引数の文字列を2進数として解釈し10進数の整数値を返す関数の処理についての問題です。
処理はi = 1~引数の文字数分解答群の処理で計算した値をresultに設定し返却する処理です。
int関数は 文字列の”0″ を整数0 、”1″を整数1に変換する関数のようです。
解答群を確認すると、 以下の共通する点があります。以下で各処理の動きを確認します。
- アとウは、int(binary の (length – i + 1) 文字目の文字) が入っている
- イとエはint (binary の i 文字目の文字) が入っている
- ウとエは、 result × 2 をしている。
int(binary の (length – i + 1) 文字目の文字) について
int(binary の (length – i + 1) 文字目の文字)は 引数が 3桁の場合、
- i = 1 の時、 length(引数の文字数) -i + 1 が 3 – 1 + 1 となり、 = binaryの3文字目の文字列
- i = 2 の時、 length(引数の文字数) -i + 1 が 3 – 2 + 1 となり、 = binaryの2文字目の文字列
- i = 3 の時、 length(引数の文字数) -i + 1 が 3 – 3 + 1 となり、 = binaryの1文字目の文字列
- i = 4 の時、 length が i を超過するため繰り返し処理終了
となり、渡された文字列を後ろから値を取得して、resultに加算していきます。
int(binary の i文字目の文字) 文字目の文字) について
int(binary の i文字目の文字) は 引数が 3桁の場合、
- i = 1 の時、 binaryの1文字目の文字列
- i = 2 の時、 binaryの2文字目の文字列
- i = 3 の時、 binaryの3文字目の文字列
- i = 4 の時、 length が i を超過するため繰り返し処理終了
となり、渡された文字列を先頭から値を取得して、resultに加算していきます。
result × 2 について
result × 2 については、繰り返し処理するたびにresultを2倍をしています。
各処理を理解してから、各解答群で”10010″で18になるか確認します。
アの場合
result + int(binary の (length – i + 1)文字目の文字)
- i = 1 :result ← 0 + 0
- i = 2 :result ← 0 + 1
- i = 3 :result ← 1 + 0
- i = 4 :result ← 1 + 0
- i = 5 :result ← 1 + 1
- i = 6 :処理終了
結果:result = 2 となり不正解
イの場合
result + int(binary の (i文字目の文字)
- i = 1 :result ← 0 + 1
- i = 2 :result ← 1 + 0
- i = 3 :result ← 1 + 0
- i = 4 :result ← 1 + 1
- i = 5 :result ← 2 + 0
- i = 6 :処理終了
結果:result = 2 となり不正解
ウの場合
result × 2 + int(binary の (length – i + 1)文字目の文字)
- i = 1 :result ← 0 × 2 + 0
- i = 2 :result ← 0 × 2 + 1
- i = 3 :result ← 1 × 2 + 0
- i = 4 :result ← 2 × 2 + 0
- i = 5 :result ← 4 × 2 + 1
- i = 6 :処理終了
結果:result = 9 となり不正解
エの場合
result × 2 + int(binary の (i文字目の文字)
- i = 1 :result ← 0 × 2 + 1
- i = 2 :result ← 1 × 2 + 0
- i = 3 :result ← 2 × 2 + 0
- i = 4 :result ← 4 × 2 + 1
- i = 5 :result ← 9 × 2 + 0
- i = 6 :処理終了
結果:result = 18 となり正解
各処理の結果から問2はエが正解であると分かります。
問題の考え方(2進数 → 10進数を理解している場合)
2進数はn桁目の数字の重みが 1 × 2のn – 1乗になる性質があるため、”10010″の場合
- “10010″ = 1 × 2 の4乗 = 1 × 2 × 2 × 2 × 2 =16
- “10010″ = 1 × 2 の1乗 = 1 × 2 = 2
であると気づくことができます。この時点で result × 2をしているだろうとある程度気づくことができます。
上記から短い文字列の “10”を引数として戻り値(result)が2となる処理について解答群から探すと、
- ア、イ:どちらもresult = 1となる。
- ウ:result = 1 となる。
エ:result = 2 となる。
となり、エが正解であると分かります。
まとめ
この問題については2進数について理解していれば、すぐに解答に気付くことができますが、
2進数について理解していなくても問題の情報から解答までたどり着くことができます。
過去問を解く際も、問題で提供されている情報から解答まで辿り着けるよう練習しておけば、本番も落ち着いて臨むことができるでしょう。
コメント