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

Problem26 1/d の中で循環節が最も長くなるd

問題

単位分数とは分子が1の分数である。
分母が2から10の単位分数を10進数で表記すると次のようになる。

1/2 = 0.5
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1
0.1(6)は 0.166666... という数字であり、1桁の循環節を持つ。1/7 の循環節は6桁ある。

d < 1000 である、 1/d の中で循環節が最も長くなる d を求めよ。


ソース

using System;
using System.Collections.Generic;

class Program
{
    private struct defineOnePair
    {
        internal int Syou;
        internal int Amari;
    }

    static void Main()
    {
        var OnePairList = new List<defineOnePair>();
        int MaxJyunkanVal = 0;
        int MaxJyunkan = 0;
        for (int I = 2; I < 1000; I++) {
            OnePairList.Clear();

            int Wararerukazu = 10;
            int Syou, Amari;

            bool FirstFlag = true;
            do {
                Syou = Wararerukazu / I;
                Amari = Wararerukazu % I;
                defineOnePair WillAdd;
                WillAdd.Syou = Syou; WillAdd.Amari = Amari;

                int wkInd = OnePairList.FindIndex(X => X.Syou == WillAdd.Syou
                                                    && X.Amari == WillAdd.Amari);
                if (wkInd >= 0) {
                    int LenJyunkan = OnePairList.Count - wkInd;
                    Console.Write(" 循環部の長さ={0}", LenJyunkan);
                    if (LenJyunkan > MaxJyunkan) {
                        MaxJyunkan = LenJyunkan;
                        MaxJyunkanVal = I;
                    }
                    break;
                }
                OnePairList.Add(WillAdd);

                if (FirstFlag) {
                    FirstFlag = false;
                    Console.WriteLine();
                    Console.Write("1/{0}=0.{1}", I, Syou);
                }
                else {
                    Console.Write(Syou);
                }
                Wararerukazu = Amari * 10;
            } while (Amari != 0);
        }
        Console.WriteLine();
        Console.WriteLine("答えは{0}で、循環部の長さ={1}", MaxJyunkanVal, MaxJyunkan);
    }
}


実行結果

省略
1/998=0.001002004008016032064128256513026052104208416833667334669338677354709418
83767535070140280561122244488977955911823647294589178356713426853707414829659318
63727454909819639278557114228456913827655310621242484969939879759519038076152304
60921843687374749498997995991983967935871743486973947895791583166332665330661322
64529058116232464929859719438877755511022044088176352705410821643286573146292585
17034068136272545090180360721442885771543086172344689378757515030060120240480961
923847695390781563126252505 循環部の長さ=498
1/999=0.001 循環部の長さ=3
答えは983で、循環部の長さ=982


解説

ListジェネリックのFindIndexメソッドを活用してます。
MSDN --- List<T>.FindIndex メソッド (Predicate<T>)