连续运行时错误

Continuous Runtime Error

本文关键字:运行时错误 连续      更新时间:2023-10-16

请任何人帮助我为什么我的代码出现运行时错误:我是找不到任何错误。

该程序旨在使用筛子找到素数,并为每个数字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;    
}

对于一个足够大的i(这里我在i=46349时得到错误),内部循环导致错误:ji(=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)
        {
...