Problem z ''wyjściem'' poza zakres tablicy c++


(Jacob4848) #1

Cześć. Mam dość krytyczny problem z kodem i mam nadzieję że dacie mi jakieś wskazówki. Otóż chcę napisać program, który z tablicy losowych liczb( dla przykładu pracuje na dziesięciu elementach) znajdzie ciąg liczb względnie pierwszych(takich, których nwd=1). Program ma wybierać liczby tak długo jak są dostępne (jednak w przykładzie pracuje na trzech okrążeniach w pętli for). Wpadłem na pomysł żeby liczby które nie są z jakąś wylosowaną liczbą względnie pierwsze wyrzucać na koniec tablicy i zmniejszać zakres szukania o 1. Pomysł był super...ale tylko przy pierwszym ''okrążeniu'' dalej program wyświetla mi duże cyfry(przekroczyłem zakres tabeli).

void losowana(int *tab,int n)
{
	int j=1;
	int i,k;
	int kolejka=0;

	for(int a=0;a3;a++)
	{
		int *t;
		t=new int[n];
		while(n1)
		{
			if(kolejka==0)
			{
				i=rand()%n;
				t[a]=tab[i];
				cout"Wylosowalem: "tab[i]endl;
				
				int bufor=tab[n-1];
				tab[n-1]=tab[k];
				tab[k]=bufor;
			}
			if(kolejka0)
			{
				k=rand()%n;
				if(nwd(t[a],tab[k])==1)
				{
					t[j]=tab[k];
			
					int bufor=tab[n-1];
					tab[n-1]=tab[k];
					tab[k]=bufor;
					j++;
				}
		
				if(nwd(t[a],tab[k])==0)
				{
					int bufor=tab[n-1];
					tab[n-1]=tab[k];
					tab[k]=bufor;
				}
			}
			n--;
			kolejka++;
		}
		
		cout"j: "jendl;
		n=j+3;
		kolejka=0;
		
		for(int c=0;cj;c++)
		{
			tab[c]=t[c];
		}
		for(int c=0;cj;c++)
		{	
			couttab[c]endl;
		}
		j=1;
		delete []t;
	}

(Rolek0) #2

:arrow: https://www.youtube.com/playlist?list=PL5D59D2682ED5B2EA

:arrow: https://www.youtube.com/watch?v=g_tNSuUPWDw&index=4&list=PL86D1D2436D8EFEDB

W pierwszym _if_ie używasz k o nieokreślonej wartości jako indeksu do tab.


(Jacob4848) #3

Rzeczywiście, to przez nieuwagę bo if był kopiowany z warunków poniżej. Zamieniłem k na i. Jedna to nic nie pomogło, obejrzę podesłane filmy, może to jakoś rozgryzę. Dzięki :slight_smile:


(Rolek0) #4

W tym przypadku, logicznie nie ma różnicy.

 

Raczej przestały się objawiać, teraz prawdopodobnie psujesz sobie stos.

 

Odkryłeś kolejny błąd logiczny w algorytmie.

Debugowałeś ten kod?


(Jacob4848) #5

Kilkukrotnie rozrysowywałem sobie jak zachowuje się tablica na kartce i to nie przyniosło żadnych efektów. Nie uzywałem żadnego programu ponieważ nie znam się na tym. Zauważyłem jednak że zawsze liczbą która wychodzi poza zakres tablicy jest pierwszym elementem nowo powstałej tablicy po jednym okrążeniu. Dla przykładu:


(kostek135) #6

(Jacob4848) #7

Wybacz napisałem niejasno. Jesli wylosuje liczbę tak jak w przykładzie powyżej czyli 73 to umieszcza ją w tej tablicy i dalej masz liczby względnie pierwsze do 73.


(kostek135) #8

To czemu wypisał 8 liczb po pierwszym przebiegu, a nie 9, 73, jest liczbą pierwszą więc wszystkie liczby, które nie są wielokrotnością 73, będą z nią względnie pierwsze, a ponieważ nie masz liczby większej niż 100, to oznaczy tyle, że wszystkie powinieneś wypisać (za wyjątkiem 73, oczywiście). Dokładniej brakuje 63, NWD(73,63) = 1.