可以请任何人帮助我为什么我的代码会给出运行时错误:我是 无法找到任何错误。
该计划的目的是找到使用筛子的素数加上找到每个数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;
}
答案 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)
{
...