
Yan Cui
I help clients go faster for less using serverless technologies.
Problem
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.
Solution
#time | |
let rec gcd a b = | |
if b = 0 | |
then abs a | |
else gcd b (a % b) | |
let ``3/7`` = 3.0 / 7.0 | |
let answer = | |
[8..1000000] | |
|> List.map (fun d -> int (floor (``3/7`` * float d)), d) | |
|> List.filter (fun (n, d) -> gcd n d = 1) | |
|> List.maxBy (fun (n, d) -> float n / float d) | |
|> fst // gets just the numerator |
This problem is fairly easy, given that the answer we’re looking for much be very close to 3 / 7 (0.4285714286) I simply iterate through the denominators, d, and find the closest numerator, n, which will produce a value less than 3 / 7. Then filter the set so we end up with only the n, d pairs that have a GCD of 1 and pick the numerator from the n, d pair whose n / d fraction is the biggest.
Whenever you’re ready, here are 3 ways I can help you:
- Production-Ready Serverless: Join 20+ AWS Heroes & Community Builders and 1000+ other students in levelling up your serverless game. This is your one-stop shop for quickly levelling up your serverless skills.
- I help clients launch product ideas, improve their development processes and upskill their teams. If you’d like to work together, then let’s get in touch.
- Join my community on Discord, ask questions, and join the discussion on all things AWS and Serverless.