


|
あるコンピュータでのお話です。
パック型
アンパック型
という 2 種類の整数型があり,このコンピュータでは上の例だとどちらも 123 という数値です。特にアンパック型は "?" の部分にはどんな数字が入っていても同じように解釈されます。つまり,具体的には
のどちらでも "45" と解釈されます。
(以下,これらの表記を "10 34 95","00 04 05" などと表すことにします。)
さて,このコンピュータには,「入力装置」,「変換装置 1」,「変換装置 2」,「演算装置」,「出力装置」の 5 つの装置があります。それぞれの装置の役割は次の通りです。
「入力装置」:
この装置は,キーボードで入力した数値をアンパック型で渡してくれます。キーボードでの入力は 3 けたまで可能です。入力した結果渡されるアンパック型の "?" の部分には 1 けたの整数が入りますが,どの数字が入るかは分かりません。
例: キーボードで 123 を入力 → 「入力装置」 → 91 82 73 (アンパック型)
「変換装置 1」:
この装置にアンパック型の整数を渡すと同じ数値を表すパック型に変換して返してくれます。このとき,アンパック型の "?" の部分は何が入っていても無視されます。
例: 12 34 56 (アンパック型) → 「変換装置 1」 → 00 02 46 (パック型)
「変換装置 2」:
この装置にパック型の整数を渡すと同じ数値を表すアンパック型に変換して返してくれます。このとき,アンパック型の "?" の部分には 1 けたの整数が入りますが,どの数字が入るかは分かりません。
例: 00 01 23 (パック型) → 「変換装置 2」 → 41 52 63 (アンパック型)
「演算装置」:
この装置は与えられた数をパック型と解釈して計算を行い,計算結果をパック型の表記で返してくれます。
例: 00 02 19 ÷ 00 00 02 → 「演算装置」 → 00 01 09 あまり 00 00 01
「出力装置」:
この装置は与えられた数をアンパック型とみなして画面に表示します。
例: 74 85 96 → 「出力装置」 → 画面に 456 と表示される
つまり,このコンピュータで計算をしたければ,
(例: 12 を入力して 12×12+12 を計算する)
| 「入力装置」で入力された数値を取得 |
10 21 32 |
| ↓ |
| 「変換装置 1」でパック型に変換 |
00 00 12 |
| ↓ |
| 「演算装置」で必要な計算 |
00 00 12 × 00 00 12 = 00 01 44 00 01 44 + 00 00 12 = 00 01 56 |
| ↓ |
| 「変換装置 2」でアンパック型に変換 |
91 85 76 |
| ↓ |
| 「出力装置」に渡して表示 |
答えは 156 (画面表示) |
という手順を踏む必要があります。
また,その計算ができないとき (0 で割り算をしようとした,小さい数から大きい数を引こうとした),あるいは,計算した結果,パック型で 100 万以上になるときには「計算不可能」という報告をします。
さて問題です。このことを知らなかった W 君が作ったプログラムでは,以下の計算を型の変換をせずに行ってしまい,
「入力装置」からキーボードで入力された 2 つの数値を取得
↓
「演算装置」でいろいろな計算
↓
「出力装置」に渡して表示
としてしまいました。入力した数字は 2 種類で,それらを A,B とすると,
| (行った計算) |
|
(画面表示) |
| A+B |
→ |
25 |
| A−B |
→ |
999 |
| A+A |
→ |
24 |
| B+B |
→ |
26 |
| A÷B |
→ |
66 あまり 14 |
| B÷A |
→ |
0 あまり 13 |
| B×B |
→ |
119 |
| A+A+A+A+A |
→ |
計算不可能 (パック型で 100 万以上の数になってしまった) |
| ※ A+A+A+A までは計算できました。 |
となってしまいました。入力した数はそれぞれいくつだったでしょうか。
注 1: キーボードで入力した数を答えてください。
(パック型あるいはアンパック型の表現で答えるのではないことに注意してください)
注 2: 2 つの数字をキーボードで入力したのは 1 回のみで,一度「入力装置」から取得した結果をすべての計算の A,B として共通に使用しています。
(旧・第二種情報処理技術者試験)
|
| ▼ 解説 |
|
B×B が 100 万以上でなかったことから,B のアンパック型表現は
より小さい。すなわち,入力された数 B は 100 未満である。
A を 5 倍すると 100 万以上になったことから,A のアンパック型表現の十万の位は 2 である。(20 万未満のときは,5 倍しても 100 万を超えないし,30 万以上のときは,4 倍すると 100 万を超えてしまう。)
よって,アンパック型表現でも入力された数でも,A>B である。
A と B が等しくなければ,A÷B と B÷A の少なくとも一方の商は 0 であるが,B÷A の 結果から,B のアンパック型表現が
であることが分かる。よって,入力された数 B は 13 である。
はじめの考察と合わせると,B のアンパック型表現は
とまで確定する。
A+B → 25 であることから,A の一の位は 2,アンパック型表現の一万の位は 0 である。すなわち,A のアンパック型表現は
A+A → 24 であることから,A のアンパック型表現の百の位は 1 または 6 であるが,A+B → 25 であることから,A のアンパック型表現の百の位は 1 に決まる。よって,入力された数 A は 12 である。
したがって,答えは A は 12,B は 13 である。
コメント:
変則的な虫食い算です。元ネタはメインフレームの 10 進数表現からです。今のシスアド試験にも出題されてるんじゃないかしらん?
|
|
|
|