Project Euler Problem 26 Reciprocal cycles
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 that1/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.
C++:
#include <iostream> using namespace std; const int N = 1000; const int MAXDIGITS = 4096; int decimal[MAXDIGITS]; int numerator[MAXDIGITS]; int getcycles(int d) { int n = 1, start, end, i, j; i=0; numerator[i] = n % d; decimal[i] = numerator[i] * 10 / d; for(i=1; ;i++) { numerator[i] = numerator[i-1] * 10 % d; decimal[i] = numerator[i] * 10 / d; for(j=0; j<i; j++) if(numerator[j] == numerator[i]) break; if(j < i) { start = j; end = i - 1; break; } if(numerator[i] == 0) { start = i; end = i; break; } } return end - start + 1; } int main() { int ans, max = 0, cycles; for(int i=1; i<N; i++) { cycles = getcycles(i); if(cycles > max) { max = cycles; ans = i; } cout << i << ": " << cycles << endl; } cout << ans << endl; return 0; }
参考链接:UVA202 UVALive5141 Repeating Decimals