Consider the fraction, n/d, where n and d are positive integers. If n<d and HCF(n,d)=1, it is called a reduced proper fraction.
If we list the set of reduced proper fractions for d ≤ 8 in ascending order of size, we get:
1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8
It can be seen that 2/5 is the fraction immediately to the left of 3/7.
By listing the set of reduced proper fractions for d ≤ 1,000,000 in ascending order of size, find the numerator of the fraction immediately to the left of 3/7.
For every number d, we would like to find n/d that is the closest number to 3/7. So, the n should be (int)(d*3/7). Another property should be met is that hcf(n,d) = 1. If this property is not met, we iterate n by minus 1 every step until the largest n that hcf(n, d) =1 is located.
Iterate the above step for d in [3, 1e6]. Record the closest ration n/d, and the corresponding numerator n.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include<iostream> using namespace std; int hcf(int n, int d); int main() { double left=(double)1/8; double mid = (double)3/7; int numerator; for (int d = 3; d <= 1e6; d++) { int num = d * mid; while (hcf(num, d) != 1) { num -= 1; } double r = (double) num/d; if ( r < mid & r > left ) { left = r; numerator = num; } } cout << "Answers to PE 71: " << numerator << endl; } int hcf(int n, int d) { int m = d % n; if (m == 0) return n; if (m == 1) return 1; while(m != 0) { d = n; n = m; m = d % n; } return n; } |
Runs < 1 sec.
Answers to PE 71: 428570 user system elapsed 0.133 0.002 0.136