繁体   English   中英

我的SPOJ生成素数的C ++程序提供了预期的输出,但最终崩溃了。 拜托,让我知道为什么会这样

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM