Quando stavo risolvendo un problema per Project Euler, mi chiedeva di riassumere tutti i numeri primi sotto 2 milioni. Qui è il mio codice:Situazione strana nel codice di controllo numero primo
#include<stdio.h>
#include<math.h>
int isPrime(int);
int main() {
long long int sum = 0;
int i; // index
for(i = 2 ; i < 2000000 ; i++) {
if(isPrime(i)) {
sum += i;
}
}
printf("%lli\n", sum);
}
int isPrime(int num) {
int i; // index
int sq = sqrt(num);
for(i = 2 ; i <= sq ; i++) {
if(num % i == 0) {
return 0;
}
}
return 1;
}
Questo codice porta alla risposta corretta, 142913828922. Ma quando cambio il ciclo for in isPrime()
a:
for(i = 2; i <= sq+1; i++) // or even sq+2, sq+3, etc.
Essa conduce a risultati non corretti, come 142.913.828.920 e 142913828917, ecc.
Perché non funziona? In teoria, non cambia il numero isPrime()
invia a main()
, vero?
Forse si utilizza troppo grandi numeri – STF