アルゴリズムとプログラミング|令和6年度 ITパスポート試験 問85
関数binaryToIntegerは,1桁以上の符号なし2進数を文字列で表した値を引数binaryStrで受け取り,その値を整数に変換した結果を戻り値とする。例えば,引数として“100”を受け取ると,4を返す。プログラム中のa,bに入れる字句の適切な組合せはどれか。
〔プログラム〕
```
○整数型: binaryToInteger(文字列型: binaryStr)
整数型: integerNum, digitNum, exponent, i
integerNum ← 0
for (i を 1 から binaryStr の文字数 まで 1 ずつ増やす)
digitNum ← binaryStr の末尾から i 番目の文字を整数型に変換した値
// 例: 文字“1”であれば整数値1に変換
exponent ← a
integerNum ← b
endfor
return integerNum
```
| a | b | |
|---|---|---|
| ア | (2 の i 乗)− 1 | integerNum × digitNum × exponent |
| イ | (2 の i 乗)− 1 | integerNum + digitNum × exponent |
| ウ | 2 の(i − 1)乗 | integerNum × digitNum × exponent |
| エ | 2 の(i − 1)乗 | integerNum + digitNum × exponent |
- (2 の i 乗)− 1 integerNum × digitNum × exponent
- (2 の i 乗)− 1 integerNum + digitNum × exponent
- 2 の(i − 1)乗 integerNum × digitNum × exponent
- ✓ これが正解2 の(i − 1)乗 integerNum + digitNum × exponent
解説
末尾から数えた桁の重みを掛けて、順に足していきます。
2進数を十進数に直すのは、基数が二である数の読み替えです。引数は文字列として渡されるので、一文字ずつ数に直して扱います。直すには、それぞれの桁の数字に、その桁の重みを掛けて足し合わせます。重みは末尾から数えて一つ目が一、二つ目が二、三つ目が四というように、二を掛けながら大きくなります。変数は末尾から数えた位置を表しているので、その位置が一のときに重みが一になる必要があります。よって重みは二の、位置から一を引いた乗になります。そして、その桁の数字と重みを掛けたものをそれまでの合計に足し込みます。よって合計に掛けるのではなく足す形が入ります。合計に掛けてしまうと、最初が零なので何を掛けても零のままになります。
ほかの選択肢はなぜ違うのか
- 重みを二の乗から一を引いたものとし、さらに合計へ掛け算で足し込むとしています。重みの作り方も足し込み方も誤っており、最初が零なので結果は必ず零になります。二か所とも取り違えた形です。
- 足し込み方は正しいのですが、重みを二の乗から一を引いたものとしています。位置が一のとき重みは一であるべきところ、この式では一になりません。末尾の桁の重みで確かめれば見つかります。
- 重みの作り方は正しいのですが、合計へ掛け算で足し込むとしています。合計は最初が零なので、何を掛けても零のままとなり、答えにたどり着けません。初期値を見れば成り立たないと分かります。
この問題に関係する言葉
- 基数
- 2進数
- 文字列
出典:令和6年度 ITパスポート試験 問85(改変:原典の図表をテキストに書き起こした)
同じ単元をまとめて解くならアルゴリズムとプログラミングへ。
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)