Я новичок в C ++. Я пытаюсь реализовать сегментированное сито, чтобы найти простые числа между заданными числами m и n. Моя логика также может быть неверной. Ниже приведен код, который я написал,
long long m;
long long n;
std::cin >> m;
std::cin >> n;
vector<bool> sieve(n-m+1,true);
for(int i=2;i<sqrt(n);i++) {
long long j = ceil(float(m)/float(i));
while(j*i <= n) {
sieve[j*i - m] = false;
j++;
}
}
Код работает для небольшого значения m (то есть начального числа). Однако, когда я увеличиваю значение m на порядок 10 ^ 8. Я получаю ошибку сегмента, потому что значение (j * i-m) становится отрицательным. Во время отладки для значения m = 63458900, для i = 3, я получаю j = 21152966, когда это должно быть 21152967 после функции ceil.
Значение n-m всегда меньше 10 ^ 6.
Любая помощь высоко ценится. Благодарю вас.
Значение, которое вы получаете, на единицу — оно должно быть 21152967
после ceil
,
Вы можете упростить
ceil(float(m)/float(i))
в
(m + i - 1) / i
и тем самым избежать возможных неточностей.
Подстановка соответствующих значений дает (63458900ll + 3 - 1)/3
который должен быть 21152967
на твоей машине.