Wyciek pamieci

0
#include <iostream>

using namespace std;

void createNumbers(bool *&table, int count){
	table = new bool[count];
	for (int i = 0; i < count + 1; i++){
		table[i] = true;
	}
}
int countPrimeNumbers(bool *table, int a, int b){
	int count = 0;
	for (int i = a; i <= b; i++){
		if (table[i]) count++;
	}
	return count;
}
int sito(bool *table, int a, int b){
	int w;
	for (int i = 2; i * i <= b; i++){
		if (table[i] != false){
			for (int j = 2 * i; j <= b; j += i)
			{
				table[j] = false;
			}
		}
	}
	return countPrimeNumbers(table, a, b);
}


int main() {
	int test = 0;
	int a = 0;
	int b = 0;
	bool *tab;

	cin >> test;
	for (int i = 0; i < test; i++){
		cin >> a >> b;
		createNumbers(tab, b);
		cout << sito(tab, a, b)<<endl;
		delete(tab);
	}
	return 0;
}

Dlaczego mam wyciek pamieci? Przeciez ladnie zwalniam pamiec :(

0

Dodaje to co mi sie wywala:
http://prntscr.com/87ky0z

0

Błąd masz już w pierwszych linijkach, dalej nie czytam.

   table = new bool[count];
    for (int i = 0; i < count + 1; i++){
        table[i] = true;

Tablica ma rozmiar count a ty wpisujesz do niej count+1 wartości. Brawo.

1
table = new bool[count];
...
delete(tab);

Jak new[] to ma być delete[].

Swoją drogą dziwny zapis i IMO mylący: delete(tab). To jest operator, nie funkcja, więc delete tab wystarczy.

0

Poprawilem

#include <iostream>

using namespace std;

void createNumbers(bool *&table, int count){
	table = new bool[count+1];
	for (int i = 1; i < count + 1; i++){
		table[i] = true;
	}
}
int countPrimeNumbers(bool *table, int a, int b){
	int count = 0;
	for (int i = a; i <= b; i++){
		if (table[i]) count++;
	}
	return count;
}
int sito(bool *table, int a, int b){
	int w = 0;
	for (int i = 2; i * i <= b; i++){
		if (table[i] != false){
			for (int j = 2 * i; j <= b; j += i)
			{
				table[j] = false;
			}
		}
	}
	return countPrimeNumbers(table, a, b);
}


int main() {
	int test = 0;
	int a = 0;
	int b = 0;
	bool *tab = NULL;

	cin >> test;
	for (int i = 0; i < test; i++){
		cin >> a >> b;
		createNumbers(tab, b);
		cout << sito(tab, a, b)<<endl;
		delete(tab);
	}
	return 0;
}
0

@twonek
Dziala dzieki

0

W sumie robie zadanie na spoja http://pl.spoj.com/problems/DYZIO2/ używam sita Eratostenesa myślałem że będzie to lepszym algorytmem ale jednak nie ;/ macie jakiś lepszy pomysł?

#include <iostream>

using namespace std;

void createNumbers(bool *&table, int count){
	table = new bool[count+1];
	for (int i = 1; i < count + 1; i++){
		table[i] = true;
	}
}
int countPrimeNumbers(bool *table, int a, int b){
	int count = 0;
	for (int i = a; i <= b; i++){
		if (table[i]) count++;
	}
	return count;
}
int sito(bool *table, int a, int b){
	int w = 0;
	for (int i = 2; i * i <= b; i++){
		if (table[i] != false){
			for (int j = 2 * i; j <= b; j += i)
			{
				table[j] = false;
			}
		}
	}
	return countPrimeNumbers(table, a, b);
}


int main() {
	int test = 0;
	int a = 0;
	int b = 0;
	bool *tab = NULL;

	cin >> test;
	for (int i = 0; i < test; i++){
		cin >> a >> b;
		createNumbers(tab, b);
		cout << sito(tab, a, b)<<endl;
		delete tab;
	}
	return 0;
}
0

Następny który nie czyta jakie są zakresy. Ech. 20 000 razy dyzio może ci kazać policzyć liczby między 0 a 106 a ty będziesz liczył. Geniusz ;] Policz wszystkie od razu a potem tylko odczytuj wynik dla zadanego przedziału.

0

No dzieki, nie wpadłem na to debil ze mnie :( Lecz dalej nie działa :

#include <iostream>

using namespace std;

void createNumbers(bool *&table, int count){
	table = new bool[count+1];
	for (int i = 1; i < count + 1; i++){
		table[i] = true;
	}
}
int countPrimeNumbers(bool *table, int a, int b){
	int count = 0;
	for (int i = a; i <= b; i++){
		if (table[i]) count++;
	}
	return count;
}
void sito(bool *&table, int b){
	int w = 0;
	for (int i = 2; i * i <= b; i++){
		if (table[i] != false){
			for (int j = 2 * i; j <= b; j += i)
			{
				table[j] = false;
			}
		}
	}
}


int main() {
	int test = 0;
	int a = 0;
	int b = 0;
	bool *tab = NULL;

	const int size = 10000000;
	createNumbers(tab, size);
	sito(tab, size);
	cin >> test;
	for (int i = 0; i < test; i++){
		cin >> a >> b;
		
		cout << countPrimeNumbers(tab,a,b) << endl;
		
	}
	return 0;
}
0

srry jak cos to porpawiłem ta liczbe const int size = 1000000; ale nadal nie działa

0

Brawo. A rozumiem że nie warto napisać co konkretnie "nie działa"? Jeśli przekraczasz czas to możesz też tak to zoptymalizować, że nie liczysz całego przedziału od razu tylko tyle ile ci potrzeba. Jak user pyta o liczby w przedziale 100-200 to liczysz tylko 0-200. Jak potem zapyta o liczby 100-300 to "doliczasz" sobie tylko 200-300 bo ich jeszcze nie masz itd.

0

Użyj tablic prefixowych. Tzn najpierw wykonujesz to sito Eratostenesa. Potem zliczasz ile jest liczb pierwszych w przedziale [0...i] dla każdego i. (odpowiednio dużego, nie wiem jakie masz zakresy). Następnie odpowiedź na zapytanie jest w czasie stałym.

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