primes — Ошибка вычисления при использовании функции ceil в Stack Overflow

Я новичок в 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.

Любая помощь высоко ценится. Благодарю вас.

-1

Решение

Значение, которое вы получаете, на единицу — оно должно быть 21152967 после ceil,

Вы можете упростить

ceil(float(m)/float(i))

в

(m + i - 1) / i

и тем самым избежать возможных неточностей.
Подстановка соответствующих значений дает (63458900ll + 3 - 1)/3 который должен быть 21152967 на твоей машине.

2

Другие решения