[C++] n-bitowy Kod Graya

Jak zwykle będę wdzięczny za wszelkie uwagi, spostrzeżenia i komentarze.

#include 

#include // do poteg


using namespace std;


void binary(int liczba);


int main()

{

	int n,biezacy=0,nastepny,grey;

	long int licznik=0;

	cout << "Podaj n: "; // liczba bitow

	cin >> n;

	cout << n << "-bitowy Kod Graya: " << "\n\n0";

	for(int i=0; i
	{

		++licznik;

		biezacy=i;

		nastepny=biezacy>>1;

		grey=biezacy^nastepny; // wyznaczanie i-tego wyrazu kodu Graya

		binary(grey); // zamiana na postac binarna i wyswietlenie

		cout << " Przeliczonych kombinacji: " << licznik << "\n";

	}

	return 0;

}


// ******************************************

void binary(int liczba) // zamiana liczby dziesietnej na dwojkowa

{

	int tablica[100]={0},i=0;

	while(liczba)

	{

		tablica[i++]=liczba%2;

		liczba=liczba/2;

	}

	for(int j=i-1; j>=0; j--)

	{

		cout << tablica[j];

	}

}

Mieszasz C++ z C(w C++ używa się cmath, nie math.h), polski z angielskim(funkcja binary(angielski), reszta po polsku).

Nie wiem co ma oznaczać zmienna “grey”, bardziej pasuje “kodGraya”, albo nawet samo “gray”.

Co do funkcji “main”, pierwsza pętla: nie musisz używać potęgowania. Podstawą jest 2, więc wydajniej będzie użyć przesunięcia bitowego w lewo(<<). Kod:

for(int i=0; i < (1 << n); i++)

Do tego rozmiar int i long int na x86 jest taki sam(nie wiem jak jest na x86_64 i innych), więc lepiej użyć __int64(GCC: int64_t) jeśli chcesz mieć 64-bitową liczbę. Co do funkcji “binary”: lepiej użyć tablicy char’ów(tablica char[33] - więcej nie potrzeba, bo int jest 32-bitowy na x86, można ewentualnie rozmiar ustawić na sizeof(int)*8 + 1). I wydajniej(AFAIK) będzie użyć koniunkcji bitowej zamiast reszty z dzielenia. Kod:

void binary(int liczba) // zamiana liczby dziesietnej na dwojkowa

{

   char tablica[sizeof(int)*8+1]={0},i=0;

   while(liczba)

   {

      tablica[i++]= '0' + (liczba & 1);

      liczba /= 2;

   }

   --i;

   for(int j = 0; j <= i; ++j, --i)

   {

      std::swap(tablica[i], tablica[j]);

   }

   std::cout << tablica;

}

Ojej ,wpisałem literkę zamiast liczby . :frowning:

Może lepiej tak wprowadzać liczbę(albo w podobny sposób):

cout << "Podaj n: "; // liczba bitow

while(!(cin>>n))

  {

    cout<<"Podaj n :";

    cin.clear();

    while(cin.get()!='\n')

       continue;

  }

Pouczasz co do potęgowania a sam?

liczba>>=1; [/code]
liczba /= 2;

liczba>>=1;

Które wykona się szybciej? Czy oba tak samo?

@dumdum: program był pisany na szybko, nie jest “idiotoodporny”. Chodziło mi raczej o sam algorytm niż o wprowadzanie liter zamiast liczb. :smiley:

:stuck_out_tongue:

Gdzie Ci się tak spieszy @jedna.

Pamietaj,że blondynka czai się za każdym krzaczorem. :lol:

Weź ogranicz też zakres wpisywania liczb n,bo jak wpiszę 5000 to ze dwa dni będzie mi liczyło(raczej overflow murowany) . :smiley: