Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why won't my code stop running?

I'm trying to solve Problem #5 in Project Euler. The code works for the example, when I check the numbers from 1 to 10 I get 2520 as a result, which is right. But when I check for the numbers from 1 to 20, the code doesn't stop running.

Here it is:

num = 0

while true

    num += 1
    check = true

    for i in 1..20

        break unless check

        check = num%i==0

    end

    break if check

end

File.open("__RESULT__.txt", "w+").write num
like image 457
Vincent Avatar asked Apr 11 '26 20:04

Vincent


1 Answers

The solution for that problem can not be found by just calculating every possible solution. The solution is so big, that it will take days (maybe years) to calculate.

There is a smarter solution using prime numbers to write down the numbers.

The example that is given (2520 is the smallest number that is divisable by the numbers 1 through 10) can be written down like this:

1 = 1 (can be skipped)  = 2^0 * 3^0 * 5^0 * 7^0
2 = 2 (prime)           = 2^1 * 3^0 * 5^0 * 7^0
3 = 3 (prime)           = 2^0 * 3^1 * 5^0 * 7^0
4 = 2^2                 = 2^2 * 3^0 * 5^0 * 7^0
5 = 5 (prime)           = 2^0 * 3^0 * 5^1 * 7^0
6 = 2 * 3               = 2^1 * 3^1 * 5^0 * 7^0
7 = 7 (prime)           = 2^0 * 3^0 * 5^0 * 7^1
8 = 2^3                 = 2^3 * 3^0 * 5^0 * 7^0
9 = 3^2                 = 2^0 * 3^2 * 5^0 * 7^0
10= 2 * 5               = 2^1 * 3^0 * 5^1 * 7^0

Now the smallest number that can be divided by these, can be calculated by using the maximum power that is used on each prime:

2^3 * 3^2 * 5^1 * 7^1 = 2520

The same can be performed (even by hand) on the numbers 1 through 20

Last hint: the answer is larger than 100.000.000 but less that a billion, so it can be calculated in minutes if done efficiently

like image 113
Marc Avatar answered Apr 13 '26 13:04

Marc



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!