-4

这段代码在 100000 之前运行良好,但如果您输入 1000000,它就会开始出现错误C++ 0xC0000094: Integer division by zero。我确信这与浮点有关。我尝试了 (/fp:precise)、(/fp:strict)、(/fp:except) 和 (/fp:except-) 的所有组合,但没有得到肯定的结果。

#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;
}
4

1 回答 1

1

问题中显示的代码不会p[1]对其进行初始化或赋值。在设置的for循环中j=1p[j]用于对 的赋值v。结果为 的未知值v。显然,它恰好为零,这导致表达式中被零除i%v

由于此代码未记录,结构不良且不可读,因此正确的解决方案是丢弃它并从头开始。

浮点数与问题无关,尽管使用pow(v, 2)来计算v 2是一个糟糕的选择;v*v会更好。但是,当整数除以零时,某些系统会打印出误导性消息“Floating exception”。尽管有消息,但这是整数运算中的错误。

于 2013-03-18T16:56:23.650 回答