2013-03-18 114 views
-4

此代碼在100000之前運行正常,但如果輸入1000000,則開始給出錯誤C++ 0xC0000094: Integer division by zero。我相信這是關於浮點的東西。我嘗試了(/ fp:precise),(/ fp:strict),(/ fp:except)和(/ fp:except-)的所有組合,但沒有獲得肯定的結果。C++ 0xC0000094:零除以整數除

#include "stdafx.h" 
#include "time.h" 
#include "math.h" 
#include "iostream" 
#define unlikely(x)(x) 

int main() 
{ 
    using namespace std; 
    begin: 
    int k; 
    cout<<"Please enter the nth prime you want: "; 
    cin>>k; 
    int cloc=clock(); 
    int*p;p=new int [k]; 
    int i,j,v,n=0; 
    for(p[0]=2,i=3;n<k-1;i+=2) 
    for(j=1;unlikely((v=p[j],pow(v,2)>i))?!(p[++n]=i):(i%v);++j); 
    cout <<"The "<<k<<"th prime is "<<p[n]<<"\nIt took me "<<clock()-cloc<<" milliseconds to find your prime.\n"; 
    goto begin; 
} 
+3

認真?!!!你能否格式化你的代碼,至少它是可讀的? – 2013-03-18 16:41:54

+0

除以0會導致不確定的結果。也就是說,你不能用0來分割一個數字。(http://en.wikipedia.org/wiki/Division_by_zero) – MAA 2013-03-18 16:43:35

+0

對不起,這是我如何保持它在控制檯。我希望現在更清楚。 @Mylleranton該操作與將某些事物歸零歸零無關。 – Flashbond 2013-03-18 16:47:31

回答

1

該問題中顯示的代碼未初始化p[1]或爲其分配值。在設置爲j=1for循環中,p[j]用於v的賦值。結果爲v的未知值。顯然,它恰好爲零,導致表達式i%v中除零。由於此代碼沒有記錄,結構不良且不可讀,所以正確的解決方案是放棄它並從頭開始。

浮點對問題沒有軸承,雖然使用的pow(v, 2)計算v 是一個好的選擇; v*v會更好。但是,當發生零除以整數時,一些系統會打印誤導消息「浮動異常」。儘管有消息,但這是整數運算中的錯誤。

+0

那麼,你覺得完美地工作到100000是正常的嗎? – Flashbond 2013-03-18 17:02:57

+0

OP最重要的調試工作將檢測到這一點。 – 2013-03-18 17:05:11

+0

@Flashbond:是的。當你不初始化內存時,不能保證其內容。您的系統可能需要做不同的事情來提供100,000個元素,而不是提供1,000,000個元素,這可能會導致在完成工作後不同的數據被留下。 – 2013-03-18 17:05:13