我知道代码不是优化代码。我只想练习分段的eratosthenes筛,并以不同的方式找到素数。
我的编译器是Dev-C ++ 5.11
系统规格:
操作系统:Windows 8.1 Embedded Pro
处理器:Intel i5(第3代)
内存:4Gb
我不知道问题是否是由硬件兼容性引起的,但我还没有使用任何低级别的程序。
请向我解释程序崩溃的原因。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
#define NUM 1000000
using namespace std;
bool a[NUM]={0};
struct prime10
{
vector<long long int> primes;
int max;
prime10()
{
max=NUM;
}
}p;
void preprocess();
bool ifprime(unsigned long long int n);
void primemn(int m,int n);
int main()
{
preprocess();
int t=0;
scanf("%d",&t);
for(int i=0;i<t;i++)
{
int a,b;
scanf("%d %d",&a,&b);
primemn(a,b);
}
return 0;
}
void preprocess()
{
for (int i=2; i<=NUM; i++){
if (a[i]==0){
for (int j = i*2; j<=NUM; j+=i){
a[j]=1;
}
}
}
}
bool ifprime(unsigned long long int n)
{
if(n<NUM){
if(!a[n])
return true;
}
else if(n%2==0)
return false;
else
{
for(int i=3;i<sqrt((long double)n);i+=2)
{
if(ifprime(i))
{
if(n%i==0)
return false;
}
}
}
return true;
}
void primemn(int m,int n)
{
if(m<NUM&&n<NUM)
{
for(long long int i=m;i<=n;i++)
{
if(i==0||i==1)
{
}
else if(!a[i])
printf("%lld\n",i);
}
}
else if(m<NUM&&n>NUM)
{
if(n<=p.max)
{
for(long long int i=m;i<NUM;i++)
{
if(!a[i])
printf("%lld\n",i);
}
for(int i=0;i<p.primes.size();i++)
printf("%lld\n",p.primes[i]);
}
else if(n>p.max)
{
for(long long int i=m;i<NUM;i++)
{
if(!a[i])
printf("%lld\n",i);
}
for(int i=0;i<p.primes.size();i++)
printf("%lld\n",p.primes[i]);
for(int k=(p.max)+1;k<=n;k++)
if(ifprime(k)){
printf("%lld\n",k);
p.primes.push_back(k);
p.max=k;
sort(p.primes.begin(),p.primes.end());
}
}
}
else if(m>NUM&&n>NUM)
{
if(m<=p.max&&n<=p.max)
for(int o=0;o<p.primes.size();o++)
{
if(p.primes[o]>=m&&p.primes[o]<=n)
printf("%lld\n",o);
}
else if(m<=p.max&&n>p.max)
{
for(int o=0;o<p.primes.size();o++)
{
if(p.primes[o]>=m&&p.primes[o]<=n)
printf("%lld\n",o);
}
for(int o1=(p.max)+1;o1<=n;o1++)
if(ifprime(o1)){
printf("%lld\n",o1);
p.primes.push_back(o1);
p.max=o1;
sort(p.primes.begin(),p.primes.end());
}
}
else if(m>p.max&&n>p.max)
{
for(int o1=m;o1<=n;o1++)
if(ifprime(o1)){
printf("%lld\n",o1);
p.primes.push_back(o1);
p.max=o1;
sort(p.primes.begin(),p.primes.end());
}
}
}
}
答案 0 :(得分:2)
您的写作位于a
的边界之外 - 您的preprocess
循环应为< NUM
。
超越此边界有不确定的行为。
可能导致邻近p
的损坏,而p
的第一个成员是vector
,{{1}时崩溃被毁的很可能。
当然其他场景也是可能的,但听起来这就是你的情况。