你刚刚被聘为数学教授。 第一周过得挺顺利,可到了第二周,事情有点不对劲。 问题是,学生们给出的每一个答案都是错的! 好在凭你的数学功底,你找出了症结所在:学生的答案确实是对的,只不过它们全都以 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⁰)
没错。上面这三个数字完全一样。恭喜!
有时需要抛出异常。这样做时,一定要附上有意义的错误信息,说明错误的来源。这能让你的代码更易读,也大大有助于调试。如果你知道错误来源属于某种类型,可以选择抛出内置错误类型中的一种,但仍然要附上有意义的信息。
这道练习要求你使用 raise 语句,针对不同的输入进制和输出进制“抛出”ValueError。只有同时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")