Quantcast
Viewing latest article 14
Browse Latest Browse All 18

project euler -- problem 71

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

Related Posts


Viewing latest article 14
Browse Latest Browse All 18

Trending Articles