效率和阵列崩溃

时间:2015-03-30 01:58:25

标签: c++ arrays

每当我运行此代码并输入超过500,000的数字时,程序就会崩溃。也可以在不使用的情况下使这更简单/更有效:向量,乘法,除法和%。非常感谢!

#include <iostream>
using namespace std;

int get_primes(int array[], int num);
void sieve(int array[], int num);
void goldbach(int primes[], int nprimes, int num);
void show(int array[], int num);

int main()
{
int num;
cout << "Enter a number to calculate up to." << endl;
cin>>num;
if ( num < 2 )
    return 0;

int array[num];
array[0]= array[1]= 0;
for ( int i= 2; i < num; ++i )
    array[i]= i;

int nprimes = get_primes(array, num);

show(array, nprimes);

goldbach(array, nprimes, num);

return 0;
}

void show(int array[], int num)
{
for (int i=0; i<num; i++)
    if (array[i] > 0)
        cout << array[i] << " "<< endl;
cout << endl;
}

int get_primes(int array[], int num)
{

sieve(array, num);


int pos = 0;
for (int i = 2; i < num; ++i)
    if (array[i] > 0)
        array[pos++] = array[i];

return pos;
}

void sieve( int array[], int num )
{
for ( int i= 0; i < num; ++i )
{
    if ( array[i] > 0 )
    {
        for ( int j = i+i; j < num; j += i )
        {
            array[j] = 0;
        }
        }
    }
}


void goldbach(int primes[], int nprimes, int num)
{

int a;
for (int a = 4; a<=num; a+=2)
{
    bool found = false;
    int i, j;


    for (i = 0; !found && i < nprimes && primes[i];  ++i)
        for (j = 0; !found && j < nprimes && primes[i]; ++j)

            {
                found = a == (primes[i] + primes[j]);

                if (found)
         cout << a << '\t' << primes[i] << " + " << primes[j] <<endl;
            }

    if (!found)
        cout << a << "\tnot found" << endl;
    }
}

2 个答案:

答案 0 :(得分:1)

int array[num]说&#34;从堆栈中分配num * sizeof(int)个字节。&#34;

所以可能你的堆栈大小只有一兆字节,当你要求更多时,你会遇到下溢情况。

答案 1 :(得分:0)

更改

int array[num];

int* array = new int[num];

并使用

更改所有函数参数
int array[] 

int* array

你仍然可以像array [i]一样访问指针。

我建议你在C ++中查找堆栈与堆内存,以了解其工作原理,并阅读指针。