トップページに戻る
次の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のどっちに到達するかを判定してます。