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

Problem92 各桁の2乗を足し合わせた数の鎖

問題

各桁の2乗を足し合わせて新たな数を作ることを, 同じ数が現れるまで繰り返す.

例えば
  44 → 32 → 13 → 10 → 1 → 1
  85 → 89 → 145 → 42 → 20 → 4 → 16 → 37 → 58 → 89

のような列である. どちらも1か89で無限ループに陥っている.
驚くことに, どの数から始めても最終的に1か89に到達する.

では, 10000000より小さい数で89に到達する数はいくつあるか?


ソース

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();

        int AnsCnt = 0;
        for (int I = 1; I < 10000000; I++) {
            if (Has89Loop(I)) AnsCnt++;
        }
        Console.WriteLine("89に到達する数の合計は{0}", AnsCnt);
        Console.WriteLine("経過時間={0}", sw.Elapsed);
    }

    static bool Has89Loop(int pTarget)
    {
        int CurrVal = pTarget;

        while (true) {
            int SumVal = 0;
            foreach (char EachChar in CurrVal.ToString()) {
                int wkInt = (EachChar - '0');
                SumVal += wkInt * wkInt;
            }

            if (SumVal == 1) return false;
            if (SumVal == 89) return true;

            CurrVal = SumVal;
        }
    }
}


実行結果

89に到達する数の合計は8581146
経過時間=00:00:08.6588915


解説

ループが、1と89のどっちに到達するかを判定してます。