トップページに戻る
次の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
解説