完全数と疑似完全数 (Ruby)


完全数疑似完全数について、判別するコードを書いてみました。

定義

完全数
その数自身を除く約数の和が、その数自身と等しい自然数
疑似完全数
その数自身を除くいくつかの約数の総和がその数自身に等しい自然数

完全数は、同時に擬似完全数でもあります。

コード

環境

  • Ruby 2.4.0

クラス Number を作りました。 is_perfect? で完全数か否かが、 is_semiperfect? で擬似完全数か否かがわかります。

初期化処理のところで約数を配列に入れてしまっています。 初期化でそれをやるべきかというのは考えるべきことではありますが、今回は目的が特化しているのでこれで。

check_semiperfect? の第1引数は部分和を作る数を配列にして格納しています。 今回は擬似完全数か否かを計算するだけなので使いませんが、足してもとの数になる約数列を出す場合に使えます。

上のコードは次のようにして実行できます。

このアウトプットは次のようになります。

補足

擬似完全数の判定は、部分和問題と呼ばれるものです。 (参考: プログラミングコンテストチャレンジブック)