Ошибка вычисления при использовании функции ceil в C++

Я новичок в 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*im) становится отрицательным. Во время отладки для значения m = 63458900, для i = 3, я получаю j = 21152966, когда это должно быть 21152967 после функции ceil.

Значение nm всегда меньше 10^6.

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

1 ответ

Решение

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

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

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

в

(m + i - 1) / i

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

Другие вопросы по тегам