Khi tôi đang giải quyết vấn đề cho Project Euler, nó yêu cầu tôi tổng hợp tất cả các số nguyên tố dưới 2 triệu. Đây là mã của tôi:Tình huống lạ trong mã kiểm tra số nguyên
#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;
}
Mã này dẫn đến câu trả lời đúng, 142913828922. Nhưng khi tôi thay đổi vòng lặp for trong isPrime()
tới:
for(i = 2; i <= sq+1; i++) // or even sq+2, sq+3, etc.
Nó dẫn đến kết quả không chính xác như 142.913.828.920 và 142913828917, v.v.
Tại sao lỗi này xảy ra? Về mặt lý thuyết, nó không thay đổi số isPrime()
gửi đến main()
, phải không?
Có lẽ bạn sử dụng số quá lớn – STF