Kiedy rozwiązywałem problem związany z projektem Euler, poprosiłem mnie o podsumowanie wszystkich liczb pierwszych poniżej 2 milionów. Tu jest mój kodu:Dziwna sytuacja w sprawdzaniu numeru pierwszego kodu
#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;
}
Kod ten prowadzi do prawidłowej odpowiedzi, 142913828922. Ale kiedy zmienić dla pętli w isPrime()
do:
for(i = 2; i <= sq+1; i++) // or even sq+2, sq+3, etc.
To prowadzi do błędnych wyników, jak i 142913828920 142913828917, itp.
Dlaczego to się nie zgadza? Teoretycznie nie zmienia numer isPrime()
wysyła do main()
, prawda?
Może używać zbyt duże cyfry – STF