2014-10-18 50 views
-1

我是新来的C++。我试图实现一个分割筛来找到质数,在给定的数字m和n之间。我的逻辑可能也是错误的。以下是我写的代码,在C++中使用ceil函数时的计算错误

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)的值变负,我得到一个seg故障。在调试值为m = 63458900的过程中,对于i = 3,我得到j = 21152966,它应该是ceil函数之后的21152967。

n-m的值总是小于10^6。

任何帮助,高度赞赏。谢谢。

+2

施展双重,而不是浮动。 – 2014-10-18 12:19:55

+2

63458900/3确实是21152966 – radar 2014-10-18 12:19:57

+0

@RADAR,对不起我的计算错误。 – 2014-10-18 12:58:07

回答

2

您得到的值为1--它应该是ceil之后的21152967

可以简化

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

(m + i - 1)/i 

,从而避免潜在的不精确。
替换相应的值将产生(63458900ll + 3 - 1)/3,在您的机器上应为21152967