2.0 KiB
The spider essentially travels on the hypotenuse of a triangle with the sides A
and B+C
.
For it to be the shortest path the condition A <= B+C
must be true.
The amount of integer-cuboids for a given value M is "All integer-cuboids with A=M
" plus integer-cuboids(M-1).
In our loop we start with M=1
and increment it in every step.
We also remember the last value (for M-1
) and loop until the value exceeds one million.
For a given value A = M
we go through all possible BC
value (0 <= BC <= 2*A
) and test if M^2 + BC^2
is an integer-square.
If such a number is found and BC <= A
then this means we have found BC/2
additional cuboids (there are BC/2
different B+C = BC
combinations where B <= C
)
If, on the other hand BC > A
then we have only found A - (BC + 1)/2 + 1
additional cuboids (because the conditionA <= BC
must be satisfied).
One of the more interesting parts was the isSquareNumber()
function, which test if a number x
has an integer square-root.
To speed this function up (it takes most of the runtime) we can eliminate around 12% of the numbers with a few clever tricks.
For example if the last digit of x
is 2
, x is never a perfect square-number. Or equally if the last hex-digit is 7
.
In our program we test twelve conditions like that:
x % 16 > 9
x % 64 > 57
x % 16 == 2
x % 16 == 3
x % 16 == 5
x % 16 == 6
x % 16 == 7
x % 16 == 8
x % 10 == 2
x % 10 == 3
x % 10 == 7
x % 3 == 2
Sources:
If none of this pre-conditions is true we have to manually test the number.
We use the same the same integer-squareroot algorithm as in previous problems.
If isqrt(x)^2 == x
the we can be sure that x is a perfect square number.