完全数

10000以下の完全数を求める - みずぴー日記 にインスパイヤされて 10000 までの完全数を求めてみます。

完全数とは 完全数 - Wikipedia に載っているように、約数の和がその数そのものになるというものです。

ここでは is_perfect_number() という関数を定義し、完全数の場合にはその数を返し、そうでない場合には 0 を返すようにしてみました。

#! /usr/loca/bin/nawk -f
# perfect_number.awk
# 引数の数までの完全数を求めます。
# usage: nawk -f perfect_number.awk num

BEGIN {
    max_limit = ARGV[1];

    for (i = 1; i <= max_limit; i++) {

        num = is_perfect_number(i);

        if (num != 0) {

            print num;

        }
    }
}

# is_perfect_number():  完全数かどうかを調べる
#   in:     整数 (num)
#   out:    完全数なら整数 (num) を返し、
#           完全数でないなら 0 を返す
function is_perfect_number(num,    i, sum_divisor) {
    for (i = 1; i <= num / 2; i++) {

        if (num % i == 0) {
            sum_divisor += i;
        }
    }

    if (sum_divisor == num) {
        return num;
    } else {
        return 0;
    }
}

コード自体は難しくありませんが、本来であればより高速に約数を求める方法を考えるべきかもしれません。

$ nawk -f perfect_number.awk 10000
6
28
496
8128

回答は 完全数 - Wikipedia にも掲載されていますが、10000 までの完全数は 4 つしかありません。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png