Saturday 11 April 2009

PROJECT EULER #26

Link to Project Euler problem 26

A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:

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

Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.

Find the value of d < 1000 for which 1/ d contains the longest recurring cycle in its decimal fraction part.


using System;
using System.Collections.Generic;

namespace project_euler
{
class Program
{
static void Main()
{
//Problem 26
DateTime start = DateTime.Now;
int maxLength = 0, result=0;
for( int i=1; i<1000; i++ )
{
int length = LengthOfCycle(i);
if( length > maxLength )
{
result = i;
maxLength = length;
}
}
Console.WriteLine(result);
TimeSpan time = DateTime.Now - start;
Console.WriteLine("This took {0}", time);
Console.ReadKey();
}
public static int LengthOfCycle(int n)
{
var quotients = new List<int>(1000){0};
var remainders = new List<int>(1000) {1};
for (int i = 1; i < 1000; i++)
{
quotients.Add(remainders[i - 1]*10/n);
remainders.Add(remainders[i - 1]*10 - quotients[i]*n);
for (int j = 0; j < i; j++)
if (quotients[j] == quotients[i] && remainders[j] == remainders[i])
return i - j;
}
return -1;
}
}
}

No comments: