ニコマコス(西暦60〜120年)による正の整数の分類法に基づいて、ある数値が完全数、過剰数、不足数のどれにあたるかを判定してください。
ギリシャの数学者ニコマコスは、正の整数の分類法を考案しました。それぞれの数値は、そのアリコット和に基づいて、完全数・過剰数・不足数のいずれか1つにだけ分類されます。
_アリコット和_とは、ある数値の約数のうち、その数値自身を除いたものの和と定義されます。
例えば、15のアリコット和は1 + 3 + 5 = 9です。
数値がアリコット和と等しいとき、その数値は完全数です。 例えば、
6は、1 + 2 + 3 = 6なので完全数です。28は、1 + 2 + 4 + 7 + 14 = 28なので完全数です。数値がアリコット和より小さいとき、その数値は過剰数です。 例えば、
12は、1 + 2 + 3 + 4 + 6 = 16なので過剰数です。24は、1 + 2 + 3 + 4 + 6 + 8 + 12 = 36なので過剰数です。数値がアリコット和より大きいとき、その数値は不足数です。 例えば、
8は、1 + 2 + 4 = 7なので不足数です。与えられた数値が完全数かどうかを判定する方法を実装してください。 取り組んでいる言語によっては、与えられた数値が過剰数か不足数かどうかを判定する方法も実装する必要があるかもしれません。
ときには例外を発生させる必要があります。その際は、エラーの原因が何であるかを示す意味のあるエラーメッセージを必ず含めるようにしましょう。こうするとコードが読みやすくなり、デバッグにも大いに役立ちます。エラーの原因がある特定の型になるとわかっている場合は、組み込みのエラー型の中から選んで発生させることもできますが、その場合も意味のあるメッセージを含めるようにしましょう。
この演習では、classify()関数に_正の整数_でない数値が渡された場合に、raise文を使ってValueErrorを「投げる」必要があります。テストが通るのは、exceptionをraiseし、それにメッセージを添えた場合だけです。
メッセージ付きでValueErrorをraiseするには、メッセージをexception型の引数として書きます。
# if a number to be classified is less than 1.
raise ValueError("Classification is only possible for positive integers.")