数学の教授として採用されたばかりです。 最初の1週間は順調でしたが、2週目になって、何かがおかしいと感じます。 問題は、学生たちが答えるすべての答えが間違っていることです! 幸いなことに、数学の力で問題の正体がわかりました。学生の答えは_正しい_のですが、すべて2進数(基数2)で書かれているのです! 驚くべきことに、学生たちは週ごとに違う基数を使っていることがわかります。 学生の答えをすばやく確かめられるように、基数を変換するツールを作ることになります。
ある基数で数を表す数字の並びを、同じ数を表す別の基数の数字の並びに変換します。
基数変換は自分で実装してみましょう。 変換を代わりにやってくれるものを使わないでください。
位取り記数法では、基数bの数は、bの累乗の線形結合として捉えることができます。
42という数を_基数10で_表すと、次のようになります。
(4 × 10¹) + (2 × 10⁰)
101010という数を_基数2で_表すと、次のようになります。
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
1120という数を_基数3で_表すと、次のようになります。
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
そうです。上の3つの数は、どれもまったく同じ数です。おめでとうございます!
ときには、例外を発生させる必要があります。その際は、エラーの原因が何であるかを示す意味のあるエラーメッセージを必ず含めるようにしてください。これにより、コードが読みやすくなり、デバッグが格段にしやすくなります。エラーの原因がある特定の種類になると分かっている場合は、組み込みのエラー型のいずれかを発生させることができますが、それでも意味のあるメッセージを含めるようにしてください。
この演習では、入力と出力の基数が異なる場合にValueErrorを「スロー」するために、raise文を使う必要があります。raiseでexceptionを発生させ、それとともに意味のあるメッセージを含めた場合にのみ、テストは通ります。
メッセージ付きでValueErrorを発生させるには、exception型の引数としてメッセージを書きます。
# for input.
raise ValueError("input base must be >= 2")
# another example for input.
raise ValueError("all digits must satisfy 0 <= d < input base")
# or, for output.
raise ValueError("output base must be >= 2")