2014-10-18 72 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