Filename: prob26.cc
// 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.
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
#define LENGTH 10000
#define OFFSET 250
#define MAX_ATTEMPT 1000
inline int cycleLength(const int denom)
{
cout << "########### " << denom << endl;
vector<int> v;
{
int working_num=10;
int remainder = -1;
for(int i=0; i<LENGTH && remainder != 0; ++i)
{
int quotiant = working_num / denom;
remainder = working_num % denom;
if(i>=OFFSET)
{
v.push_back(quotiant);
}
working_num = (working_num - (quotiant * denom)) * 10;
}
}
// for(vector<int>::const_iterator i=v.begin();
// i != v.end();
// ++i)
// {
// cout << *i;
// }
// cout << endl;
if(v.size() == LENGTH-OFFSET)
{
int start_of_cycle = 1;
while(v.at(0) != v.at(start_of_cycle++))
{
}
--start_of_cycle;
while(1)
{
bool match = true;
for(int i=0; i<start_of_cycle; ++i)
{
match = match
&& v.at(i) == v.at(start_of_cycle+i)
&& v.at(i) == v.at(2*(start_of_cycle)+i)
&& v.at(i) == v.at(3*(start_of_cycle)+i);
}
if(match)
{
return start_of_cycle;
}
else
{
++start_of_cycle;
while(v.at(0) != v.at(start_of_cycle++))
{
}
--start_of_cycle;
}
}
}
return 0;
}
int main()
{
int max_generator = 1;
int max = -1;
for(int i=1; i<=MAX_ATTEMPT; ++i)
{
if(cycleLength(i) > max)
{
max = cycleLength(i);
max_generator = i;
}
}
cout << max_generator << ":" << cycleLength(max_generator) << endl;
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1
No comments:
Post a Comment