|
| 1 | +""" |
| 2 | +Ordered fractions |
| 3 | +Problem 71 |
| 4 | +https://projecteuler.net/problem=71 |
| 5 | +
|
| 6 | +Consider the fraction n/d, where n and d are positive |
| 7 | +integers. If n<d and HCF(n,d)=1, it is called a reduced proper fraction. |
| 8 | +
|
| 9 | +If we list the set of reduced proper fractions for d ≤ 8 |
| 10 | +in ascending order of size, we get: |
| 11 | + 1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, |
| 12 | + 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8 |
| 13 | +
|
| 14 | +It can be seen that 2/5 is the fraction immediately to the left of 3/7. |
| 15 | +
|
| 16 | +By listing the set of reduced proper fractions for d ≤ 1,000,000 |
| 17 | +in ascending order of size, find the numerator of the fraction |
| 18 | +immediately to the left of 3/7. |
| 19 | +""" |
| 20 | + |
| 21 | + |
| 22 | +def solution(numerator: int = 3, denominator: int = 7, limit: int = 1000000) -> int: |
| 23 | + """ |
| 24 | + Returns the closest numerator of the fraction immediately to the |
| 25 | + left of given fraction (numerator/denominator) from a list of reduced |
| 26 | + proper fractions. |
| 27 | + >>> solution() |
| 28 | + 428570 |
| 29 | + >>> solution(3, 7, 8) |
| 30 | + 2 |
| 31 | + >>> solution(6, 7, 60) |
| 32 | + 47 |
| 33 | + """ |
| 34 | + max_numerator = 0 |
| 35 | + max_denominator = 1 |
| 36 | + |
| 37 | + for current_denominator in range(1, limit + 1): |
| 38 | + current_numerator = current_denominator * numerator // denominator |
| 39 | + if current_denominator % denominator == 0: |
| 40 | + current_numerator -= 1 |
| 41 | + if current_numerator * max_denominator > current_denominator * max_numerator: |
| 42 | + max_numerator = current_numerator |
| 43 | + max_denominator = current_denominator |
| 44 | + return max_numerator |
| 45 | + |
| 46 | + |
| 47 | +if __name__ == "__main__": |
| 48 | + print(solution(numerator=3, denominator=7, limit=1000000)) |
0 commit comments