[英]My C++ program for SPOJ generating primes gives expected output but crashes at the end. Please, let me know why it is happening
我知道代码不是经过优化的代码。 我只想练习erathesthenes的分段筛,并以其他方式找到素数。
我的编译器是Dev-C ++ 5.11。
系统规格:
操作系统:Windows 8.1 Embedded Pro
处理器:Intel i5(第三代)
RAM: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());
}
}
}
}
您正在a
的边界之外书写-您的preprocess
循环应为< NUM
。
超出此边界具有不确定的行为。
它可能会导致相邻p
损坏,并且由于p
的第一个成员是vector
,因此vector
被破坏时很可能发生崩溃。
当然,其他情况也是可能的,但是听起来这就是您的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.