C程序: crashes for values greater than 0. 300万

标签 c

这个程序是求质数,即最多数量的连续质数之和。当我将 LIMIT 的值设置为 50 100 甚至 1000 时,会获得正确的值。但如果我将 LIMIT 的值设置为大于 30 万,程序就会崩溃。这个问题背后的原因是什么?我该如何解决?

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define LIMIT 300000
//binary search function

int Bsearch(long long int *arr,long long int low,long long int high,long long int search)
{
    if(high<low)
        return 0;

    long long int mid = (low+high)/2;

    if(search<arr[mid])
    {return(Bsearch(arr,low,mid-1,search));}

    else if(search>arr[mid])
    {return(Bsearch(arr,mid+1,high,search));}

    else if(search==arr[mid]) return 1;

    else return 0;
}

int main()
{
    long int arr[LIMIT];

    arr[0]=0;arr[1]=1;

    for(long long int i=2;i<=LIMIT;i++)
    {arr[i]=1;}

    long long index=2;

    for(long long int i=3;i<=LIMIT;i++,index++)
    {
        for(long long int j=2;j<=sqrt(i);j++)
        {
            if(i%j==0)
            {arr[index]=0;}
        }
    }
    long long int count=0;
    //calculate total primes
    for(long int A=0;A<LIMIT;A++)
    {
        if(arr[A]==1)
            count++;
    }

    //all primes stored in seperate primes array
    long long int primes[count];
    for(long int A=0,index=0;A<LIMIT;A++)
    {
        if(arr[A]==1)
        {
            primes[index++]=A+1;
        }
    }

    long long int primes_sum[count];
    primes_sum[0]=primes[0];
    for(long long int B=1;B<count;B++)
    {primes_sum[B]=primes_sum[B-1]+primes[B];}

    for(long long int i =0;i<(sizeof(primes)/sizeof(long long int));i++)
    {
        printf("\nprime number : %lld\tprimes_sum : %lld",primes[i],primes_sum[i]);
    }

    struct ultimata
    {
        long long int num_of_primes;
        long long int prime_number;     
    }final;

    final.num_of_primes=0;final.prime_number=0;
    for(long long int j=(sizeof(primes_sum)/sizeof(long long int))-1;j>=2;j--)
    {
        for(long long int i=j-2;i>=1;i--)
        {
            long long int search_term = primes_sum[j]-primes_sum[i];
            printf("\nsearch term : %lld (primes_sum[%lld]-primes_sum[%lld])",search_term,j,i);
            if(search_term>LIMIT)
                break;
            if(Bsearch(primes,0,(sizeof(primes)/sizeof(long long int)),search_term))
            {
                printf("\nfound! : %lld terms : %lld",search_term,j-i-1);
                if((j-i-1)>final.num_of_primes)
                {
                    printf("\nfound! : %lld",search_term);
                    final.prime_number=search_term; 
                            final.num_of_primes=j-i-1;
                }   
            }
        }
    }

    printf("Largest prime number : %lld",final.prime_number,final.num_of_primes);
    return 0;
}

最佳答案

我认为你的问题之一是在这些方面(在其他地方也多次出现):

long int arr[LIMIT];

...

for(long long int i=2;i<=LIMIT;i++)
{arr[i]=1;}

您的数组有 LIMIT 条目,但您尝试写入条目 LIMIT+1。 C 从数组索引 0 开始,以 size-1 结束。 我不知道为什么它适用于较小的 LIMIT 值。

关于C程序: crashes for values greater than 0. 300万,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21222190/

相关文章:

c - 从子网和地址前缀长度生成子网掩码

c - Mac OS 10.7 (Lion) 上类似 Valgrind 的工具

c - 为什么此代码会返回段错误?

c - 堆栈上的局部变量和 EBP 之间是什么?

c - 仅打印长度超过 10 个字符的输入行 (ANSI C)

c - 从文件读取字节并存储在数组中 - C

c - 如何释放 C 中的链表?

c - Malloc 的段错误

c - Getopt 订购,有吗?

c - 如何理解多线程和互斥原语