我是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时。我得到一个seg错误,因为(j * i-m)的值变为负数。在调试m = 63458900的值期间,对于i = 3,我得到j = 21152966,当它在ceil函数之后应该是21152967。
n-m的值总是小于10 ^ 6.
非常感谢任何帮助。谢谢。
答案 0 :(得分:2)
你得到的价值是一个 - 在21152967
之后它应该是ceil
。
您可以简化
ceil(float(m)/float(i))
到
(m + i - 1) / i
从而避免潜在的不精确。
替换相应的值会在您的计算机上生成(63458900ll + 3 - 1)/3
,21152967
。