连续运行时错误

时间:2015-11-13 19:00:27

标签: c++

可以请任何人帮助我为什么我的代码会给出运行时错误:我是 无法找到任何错误。

该计划的目的是找到使用筛子的素数加上找到每个数n的最小素数因子

其中n在1 <= n <= 10 ^ 7

的范围内
#include<iostream>
#include<vector>
#include<cmath>
#include<cstdio>
#include<cstring>
typedef long long ll;
#define MAX 10000000

using namespace std;



bool arr[MAX+1]={false};
int sp[MAX+1]={0};





void Sieve(){
for (int i = 2; i <= MAX; i=i+2)    
{sp[i] = 2;
}
for (int i = 3; i <= MAX; i=i+2)
{
    if (arr[i]==false)
    {
        sp[i] = i;

        for (int j = i; (j*i) <= MAX; j=j+2)
        {
            if (arr[j*i]==false)
            {

                arr[j*i] = true;
                sp[j*i] = i;

            }
        }
    }
}
}




//inline int scan_d()    {int ip=getchar_unlocked(),ret=0,flag=1;for(;ip<'0'||ip>'9';ip=getchar_unlocked())if(ip=='-'){flag=-1;ip=getchar_unlocked();break;}for(;ip>='0'&&ip<='9';ip=getchar_unlocked())ret=ret*10+ip-'0';return flag*ret;}


int main()
{


Sieve();

return 0;    

}

1 个答案:

答案 0 :(得分:2)

对于足够大的i(这里我在i=46349时出错),内部循环导致错误:j初始化为i(= 46349),然后条件(j*i) <= MAX由于溢出而表现出意外,j*i给出了否定结果。 解决此问题的一种方法是限制i的范围(这也会提高性能):

int sqrtMAX=sqrt(MAX);
// write it globally or somewhere before the looping.
// thanks to @Thomas Matthews
...
for (int i = 3; i <= sqrtMAX/*instead of MAX*/ ; i=i+2)
    if (arr[i]==false)
        {
...