読者です 読者をやめる 読者になる 読者になる

Project Euler 26

Problem 26

素直に割っていき、余りがゼロになるかまたはサイクルするまで繰り返す。

using System;
using System.Collections.Generic;
using System.Linq;

class PE026 {
    static List<int> CalcRecurringCycle(int d) {
        var divs = new List<int>();
        var mods = new List<int>();

        int n = 1;
        while (n != 0) {
            if (n < d) {
                divs.Add(0);
                mods.Add(n);
                n *= 10;
            }
            else {
                int div = n / d;
                int mod = n % d;

                int p = mods.IndexOf(mod);
                divs.Add(div);
                mods.Add(mod);
                if (p != -1) {
                    return divs.Skip(p+1).ToList();
                }
                n = mod * 10;
            }
        }
        return new List<int>(); // サイクルなし
    }

    static void Main() {
        var ans = Enumerable.Range(2, 1000-2)
                  .Select(i => Tuple.Create(CalcRecurringCycle(i).Count, i))
                  .Max();
        Console.WriteLine(ans.Item2);
    }
}

プログラムを書いた後に、いつも 桃の天然水 さんの記事を参考にさせていただいています。 Project Euler 26 - 桃の天然水 を読みましたが、理解するのが難しいです。