LoginSignup
2
2

More than 5 years have passed since last update.

Project Euler Q21 【友愛数】

Last updated at Posted at 2017-11-08

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。

問題

$d(n)$ を $n$ の真の約数の和と定義する. (真の約数とは $n$ 以外の約数のことである. )
もし, $d(a) = b$ かつ $d(b) = a$ ($a ≠ b$ のとき) を満たすとき, $a$ と $b$ は友愛数(親和数)であるという.

例えば, $220$ の約数は $1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110$ なので $d(220) = 284$ である.
また, $284$ の約数は $1, 2, 4, 71, 142$ なので $d(284) = 220$ である.

それでは$10000$未満の友愛数の和を求めよ.

解答

※実行には124秒ほどかかります。

seq 2 10000 |
awk '{for(i=1;i<=$1;i++){if(i==$1){print i""}else if($1%i==0){printf i" "}}}' |
awk '{for(i=1;i<=NF-1;i++){s[NR]+=$i};print s[NR],$NF,$NF,s[NR]}' |
xargs -n2 |
sort -n |
uniq -c |
awk '$1==2 && $2!=$3{s+=$2} END{print s}'
31626

等比数列の和の公式を使用する方法もあるが、実行時間があまり変わらない上にワンライナーが複雑になったのでやめた。

答え合わせ

こちらのサイト様と一致していればOKとした。
Project Euler 21 _ 友愛数 - PEをMathematicaで

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2