/ / Effizienz und Array-Absturz - C ++, Arrays

Effizienz und Array-Absturz - C ++, Arrays

Immer wenn ich diesen Code ausführe und eine Zahl über gebe500.000, stürzt das Programm ab. Es ist auch weg, um dies einfacher / effizienter zu machen, ohne: Vektoren, Multiplikation, Division und%. Danke vielmals!

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

Antworten:

1 für die Antwort № 1

Sprichwort int array[num] sagt "zuteilen num * sizeof(int) Bytes vom Stapel. "

Es kann also sein, dass Ihr Stack nur ein Megabyte groß ist, und wenn Sie nach mehr fragen, treffen Sie einen Unterlauf.


0 für die Antwort № 2

Veränderung

int array[num];

zu

int* array = new int[num];

und ändern Sie alle Funktionsargumente von verwenden

int array[]

zu

int* array

Sie können immer noch auf die Zeiger wie array [i] zugreifen.

Ich würde Ihnen empfehlen, in C ++ Stack vs Heap-Speicher nachzuschlagen, um zu verstehen, warum das funktioniert, und um auch auf Zeigern zu lesen.