どーも、みつおです。
友愛数って授業で習いましたっけ?プロジェクトオイラーをやってて初めて聞いた。
問題
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未満の友愛数の和を求めよ.
出典:Problem21
解答
using System;
using System.Collections.Generic;
using System.Linq;
namespace Problem21
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Solve());
Console.ReadLine();
}
private static int Solve()
{
int ret = 0;
List<int> yuai = new List<int>();
int b = 0;
for (int a = 1; a < 10000; a++)
{
//aの約数の和
b = Yakusu(a).Sum();
//aとbが友愛数であるか判定
if (a == Yakusu(b).Sum() && a != b)
{
yuai.Add(a);
}
}
//10000未満の友愛数の和
ret = yuai.Sum();
return ret;
}
private static List<int> Yakusu(int num)
{
List<int> ret = new List<int>();
for(int i = 1;i <= num/2; ++i)
{
//割り切れたら、約数のリストに追加
if (num % i == 0) ret.Add(i);
}
return ret;
}
}
}
出力
31626