-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

このコードは文書化されておらず、構造が不十分で、読みにくいため、適切な解決策は、コードを破棄して最初から始めることです。

浮動小数点は問題とは関係ありませんが、v2pow(v, 2)の計算にを使用するのは適切ではありません。より良いサービスを提供します。ただし、一部のシステムでは、ゼロによる整数除算が発生すると、誤解を招くメッセージ「フローティング例外」が出力されます。メッセージにもかかわらず、これは整数演算のエラーです。v*v

于 2013-03-18T16:56:23.650 に答える