2013-03-18 3 views
-4

Этот код работает отлично до 100000, но если вы введете 1000000, он начнет выдавать ошибку C++ 0xC0000094: Integer division by zero. Я уверен, что это что-то о плавающих точках. Я пробовал все комбинации (/ fp: exact), (/ 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

Серьезно? !!! Можете ли вы отформатировать свой код, чтобы он был, по крайней мере, читабельным? –

+0

Деление на 0 приведет к бесконечным результатам. т. е. вы не можете разделить число на 0. (http://en.wikipedia.org/wiki/Division_by_zero) – MAA

+0

Извините, так я хранил его в консоли. Надеюсь, теперь это становится яснее. @Mylleranton Операция не имеет ничего общего с делением чего-то на ноль. – Flashbond

ответ

1

код отображается в вопросе не инициализирует p[1] или присвоить ему значение. В цикле for, который устанавливает j=1, p[j] используется при назначении v. Результаты неизвестного значения для v. По-видимому, оно оказывается равным нулю, что приводит к делению на ноль в выражении i%v.

Поскольку этот код недокументирован, плохо структурирован и нечитабелен, правильным решением является его отбросить и начать с нуля.

с плавающей точкой не имеет отношение к проблеме, хотя использование pow(v, 2) для расчета v является плохим выбором; v*v будет служить лучше. Однако некоторые системы печатают вводящее в заблуждение сообщение «Плавающее исключение», когда происходит целочисленное деление на ноль. Несмотря на сообщение, это ошибка в целочисленной операции.

+0

Итак, как вы думаете, нормально ли работать до 100000? – Flashbond

+0

Самое тривиальное отладочное усилие от OP могло бы обнаружить это. –

+0

@Flashbond: Да. Когда вы не инициализируете память, нет никаких гарантий относительно ее содержимого. Вашей системе, возможно, придется делать разные вещи, чтобы обеспечить 100 000 элементов, чем это сделать, чтобы обеспечить 1 000 000 элементов, и это может привести к тому, что после завершения работы будут оставлены разные данные. –

Смежные вопросы