Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。
問題
完全数とは, その数の真の約数の和がそれ自身と一致する数のことである. たとえば, 28の真の約数の和は, $1 + 2 + 4 + 7 + 14 = 28$ であるので, 28は完全数である.
真の約数の和がその数よりも少ないものを不足数といい, 真の約数の和がその数よりも大きいものを過剰数と呼ぶ.
12は, $1 + 2 + 3 + 4 + 6 = 16$ となるので, 最小の過剰数である. よって2つの過剰数の和で書ける最少の数は24である. 数学的な解析により, 28123より大きい任意の整数は2つの過剰数の和で書けることが知られている. 2つの過剰数の和で表せない最大の数がこの上限よりも小さいことは分かっているのだが, この上限を減らすことが出来ていない.
2つの過剰数の和で書き表せない正の整数の総和を求めよ.
解答
※実行には4分くらいかかります。
seq 28123 |
awk '{for(i=1;i<=$1;i++){if($1%i==0){s[NR]+=i}};print s[NR]-NR,NR}' |
awk '$1>$2{printf $2" "}' |
awk '{for(i=1;i<=NF;i++){for(j=i;j<=NF;j++){print $i+$j}}}' |
sort -u |
join -v1 <(seq 28123 | sort) - |
awk '{s+=$1} END{print s}'
4179871
できたけど約数の和を算出する処理でどうしても時間がかかってしまう。
答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/023.html