Jak zoptymalizować kod c++? (narzucony limit pamięci)

0

Zadanie: Dla danej liczby n (1 ≤ n ≤ 1000) wypisz n kolejnych liczb pierwszych w odwrotnej kolejności.
Czas: 1s
Pamięć: 8 MB
Za każdym razem wychodzi mi przekroczony limit pamięci, a nie wiem, w jaki inny (bardziej wydajny) sposób mogę dojść do rozwiązania.

#include<iostream>
using namespace std;

const int N = 10000000;
bool T[N+1];
void sitoEratostenesa(void)
{
	int n, p, w;
	for (n=2; n<=N; n++) T[n] = 1;
	
	for (p=2; p*p<=N; p++)
	{
		if (T[p]==1)
		{
			for (w=p*p; w<=N; w=w+p)
			{
				T[w] = 0;
			}
		}
	}
}

bool isPrime(int p)
{
	return T[p];
}

int ithPrime[1000000];

int main()
{
	int licznik, p, k;
	sitoEratostenesa();
	int zz;
	cin >> zz;
	k = 0;
	for (p=2; p<=N; p++)
	{
		if (T[p]==true)
		{
			ithPrime[ k ] = p;
			k = k+1;
		}
	}
	
	for (int i=zz; i>0; i--)
	{
		cout << ithPrime[i] << ",";
	}
	return 0;
}

0

niepotrzebnie deklarujesz takie tablice. Zresztą i tak powinna (powinna, bo druga nie jest potrzebna) być alokowane dynamicznie. Kod jest zupełnie nieprzemyślany. Algorytm dla sita jest zły

1

Alokujesz tablice na rozmiar w sumie 10000004B + 100000001B = 13MB. Nie wiem po co ta tablica z boolenami, ale tysięczna liczba pierwsza to 7919 więc wystarczy zaalokować tablicę intów na taki rozmiar i dla niej wykonać sito. Liczby nie-pierwsze zapisz w niej jako zero.

1

Możesz też hardcodować listę liczb pierwszych do kodu. Będzie szybciej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1