Voilà ma première solution (Une boucle naive). Elle met 6 secondes pour trouver le résultat :
int i = 0, k = 1, n = 0, tab[150000] = {1}, m = 0;
double s = 0;
for (i = 0 ; i < 2000000 ; i++)
{
for (k = 0 ; tab[k] != 0 && tab[k] <= sqrt(i) && n <= 2 ; k++)
{
if (i % tab[k] == 0)
n++;
}
if (n == 1)
{
tab[m] = i;
m++;
s += i;
}
n = 0;
}
s--;
printf("%lf\n", s);
Ma deuxième solution (utilisant le Crible d'Eratosthene). Elle met 0.234 secondes pour trouver le résultat :
- include <stdio.h>
- define LEN 2000000
int sieve[LEN];
int main(void)
{
int i, j;
double sum = 0;
for (i = 0; i < LEN; ++i)
sieve[i] = 1;
for (i = 2; i < LEN; ++i)
{
if (1 == sieve[i])
{
sum += i;
for (j = 2 * i; j < LEN; j += i)
sieve[j] = 0;
}
}
printf("%.0lf\n", sum);
return 0;
}
Bon, quand j'ai dit une minute, c'est parce que le Project Euler (duquel est tiré l'exercice) propose de trouver le résultat en un temps qui ne dépasse une minute. C'est tout !