Roberto Selbach

# Euler 9 in C

So I recently wrote an ugly solution to Project Euler’s problem #9. It was written in Python and even though every other Project Euler solution I wrote ran in less than one second, this one took over 18 seconds to get to the answer. Obviously it’s my fault for using a purely brute force algorithm.

Anyway, boredom is a great motivator and I just rewrote the exact same algorithm in C, just to see how much faster it would be.

``````#include <stdio.h>

int is_triplet(int a, int b, int c)
{
return (((a < b) && (b < c)) && ((a * a + b * b) == (c * c)));
}

int main(void)
{
for (int a = 0; a < 1000; a++)
for (int b = a + 1; b < 1000; b++)
for (int c = b + 1; c < 1000; c++)
if ((a + b + c == 1000) && is_triplet(a, b, c)) {
printf("%d %d %d = %dn", a, b, c,
a * b * c);
return 0;
}
}
``````

It’s the exact same algorithm, but instead of 18 seconds, it ran in 0.072s.

Update: And here’s the version suggested by Gustavo Niemeyer:

``````#include <stdio.h>

int is_triplet(int a, int b, int c)
{
return ((a * a + b * b) == (c * c));
}

int main(void)
{
for (int a = 1; a < 1000; a++)
for (int b = a + 1; b < (1000 - a) / 2; b++) {
int c = 1000 - a - b;
if (is_triplet(a, b, c)) {
printf("%d %d %d = %dn", a, b, c,
a * b * c);
return 0;
}
}
}
``````

It now runs in 0.002s :–)