トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Problem21 10000未満の友愛数の合計

問題

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未満の友愛数の合計を求めよ。


ソース

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        int SumVal = 0;
        for (int I = 1; I < 10000; I++) {
            int wkD = DeriveD(I);
            if (DeriveD(wkD) == I && I < wkD) {
                Console.WriteLine("{0}と{1}は友愛数", I, wkD);
                SumVal += I + wkD;
            }
        }
        Console.WriteLine("友愛数の合計={0}", SumVal);
    }

    //真の約数の和を求める
    static int DeriveD(int pTarget)
    {
        var YakusuuSet = new HashSet<int>();

        for (int I = 1; I * I <= pTarget; I++) {
            if (pTarget % I == 0) {
                YakusuuSet.Add(I);
                YakusuuSet.Add(pTarget / I);
            }
        }

        int WillReturn = 0;
        foreach (int EachInt in YakusuuSet) {
            if (EachInt != pTarget)
                WillReturn += EachInt;
        }
        return WillReturn;
    }
}


実行結果

220と284は友愛数
1184と1210は友愛数
2620と2924は友愛数
5020と5564は友愛数
6232と6368は友愛数
友愛数の合計=31626


解説

HashSetで真の約数を管理してます。