我的SPOJ生成素数的C ++程序给出了预期的输出但最后崩溃了。请让我知道它为什么会发生

时间:2015-10-23 13:59:59

标签: c++ primes

我知道代码不是优化代码。我只想练习分段的eratosthenes筛,并以不同的方式找到素数。

我的编译器是Dev-C ++ 5.11 系统规格:
操作系统:Windows 8.1 Embedded Pro
处理器:Intel i5(第3代)
内存:4Gb 我不知道问题是否是由硬件兼容性引起的,但我还没有使用任何低级别的程序。

请向我解释程序崩溃的原因。

enter image description here

#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());
            }
        }   
    }
}

1 个答案:

答案 0 :(得分:2)

您的写作位于a的边界之外 - 您的preprocess循环应为< NUM

超越此边界有不确定的行为。

可能导致邻近p的损坏,而p的第一个成员是vector,{{1}时崩溃被毁的很可能。

当然其他场景也是可能的,但听起来这就是你的情况。