Tim Varley Logo
Tim Varley Principal AI Engineer and Tech Leader
Problem #71 easy

Ordered Fractions

Consider the fraction, nd\dfrac n d, where nn and dd are positive integers. If n<dn \lt d and HCF(n,d)=1\operatorname{HCF}(n,d)=1, it is called a reduced proper fraction.

If we list the set of reduced proper fractions for d8d \le 8 in ascending order of size, we get: 18,17,16,15,14,27,13,38,25,37,12,47,35,58,23,57,34,45,56,67,78\frac 1 8, \frac 1 7, \frac 1 6, \frac 1 5, \frac 1 4, \frac 2 7, \frac 1 3, \frac 3 8, \mathbf{\frac 2 5}, \frac 3 7, \frac 1 2, \frac 4 7, \frac 3 5, \frac 5 8, \frac 2 3, \frac 5 7, \frac 3 4, \frac 4 5, \frac 5 6, \frac 6 7, \frac 7 8

It can be seen that 25\dfrac 2 5 is the fraction immediately to the left of 37\dfrac 3 7.

By listing the set of reduced proper fractions for d1000000d \le 1\,000\,000 in ascending order of size, find the numerator of the fraction immediately to the left of 37\dfrac 3 7.

View on Project Euler

Implementations

cpp
#include <iostream>
#include <numeric>
int ordered_fractions()
{
long long best_n = 0, best_d = 1;
for (int d = 1; d <= 1000000; ++d) {
long long n = (3LL * d - 1) / 7;
if (n > 0 && std::gcd((int)n, d) == 1) {
if (best_n * (long long)d < n * best_d) {
best_n = n;
best_d = d;
}
}
}
return best_n;
}
#if ! defined UNITTEST_MODE
int main(int argc, char const *argv[])
{
std::cout << "Answer: " << ordered_fractions() << std::endl;
}
#endif // #if ! defined UNITTEST_MODE
View on GitHub
O(N) time, O(1) space (linear scan with GCD checks)
tvarley.github.io/src/content/euler/problem-071.md