Zamiana liczb dziesiętnych na binarne

0

Witam. Mam problem z moim programem do zamieniania liczb dziesiętnych na binarne. Kod, który można zobaczyć poniżej jest oczywiście ze 2-3 razy dłuższy od standardowych rozwiązań dostępnych w internecie, ale chciałem spróbować trochę z innej strony.
Generalnie wszystko działa jednak poprawnie są zamieniane liczby tylko z zakresu 0-1024 + kolejne potęgi dwójki.
Wpisanie już chociażby 1025 powoduje wyświetlanie się głupot jak np. trójki czy siódemki w zapisie binarnym...

Byłbym bardzo wdzięczny za jakąkolwiek uwagę, wskazówkę czy sugestię.

 
#include <iostream>
#include <conio.h>
#include <string>
#include <cstdlib>

using namespace std;

int main()
{
	int a;
	
	string bin;
	
	cout << "==Program zamienia liczby dziesietne na binarne==\n\n";
	cout << "Podaj liczbe w formacie dziesietnym: ";
	cin >> a;
	
	int dx;
	dx = a;
	
	if (a==0)
	{
		cout << "\nTwoja liczba w postaci binarnej: 0";
    }
    else
    {
		while(a>0)
		{
	    	if (a%2==0)
	    	{
			    bin+="0";
		    	a=a/2;
	    	}
	    	else
	    	{
			    bin+="1";
		    	a=a/2;
	    	}
	    }
	    
	    int cyfra;
	    int b=atoi(bin.c_str());
	    
	    cout << "\nTwoja liczba w postaci binarnej: ";
	    
	    int g;
	    g = b;
	    
	    if(g)
	    {
			    
	        while(g)
	        {
		       cyfra=g%10;
	    	   cout << cyfra;
		       g=g/10; 
	     	}
	    }
	    
	    if (dx%2==0)
	    {
			while(dx%2==0)
			{
			cout << "0";
			dx=dx/2;
            }           
		}
   	}
    
    getch();
}
0

A co niby robi ten cały fragment kodu od int cyfra? Bo do tego miejsca mialeś w miare sensowny algorytm...

0

Jak już zostało powiedziane, Twój kod nie jest zły, ale nie wiadomo, po co kombinujesz z zamianą na dziesiętne i takim alternatywnym wypisaniem od tyłu. Zauważ, że liczby tak samo wyglądające: dziesiętna i binarna (pod względem cyfr) dają nam liczby, gdzie ta dziesiętna jest znacznie większa i potrzebuje więcej pamięci! A Ty już masz tą liczbę tylko w odwróconej kolejności, gdy dochodzisz do tworzenia zmiennej cyfra! Po co się tak męczyć? Wypiszmy tego stringa od tyłu.
Poza tym,

exol napisał(a):
 
		while(a>0)
		{
	    	if (a%2==0)
	    	{
			    bin+="0";
		    	a=a/2;
	    	}
	    	else
	    	{
			    bin+="1";
		    	a=a/2;
	    	}

Strasznie to wielkie, można to uprościć. Proponowałbym taką formę:

  for(;a;a/=2)
   {
    bin+='0'+a%2;
   }

Przykładowy kod, zrobiony na podstawie Twojego mógłby wyglądać tak:

#include <iostream>

using namespace std;

int main()
 {
  int a;
  string bin="";
  cout << "==Program zamienia liczby dziesietne na binarne==\n\nPodaj liczbe w formacie dziesietnym: ";
  cin >> a;
  for(;a;a/=2)
   {
    bin+='0'+a%2;
   }
  cout << "\nTwoja liczba w postaci binarnej: ";
  //Teraz nie wypisuje za pomocą inta, a po prostu stringa od końca.
  if(bin!="")
   for (string::reverse_iterator r=bin.rbegin(); r!=bin.rend(); ++r)
    cout << *r;
  else
   cout<<"0";
  cout<<'\n';
  return 0;
 }

Można też oczywiście wypisać tablicę od końca w bardziej cywilizowany sposób, np. tak:

   for (int i=bin.size();i--;)
    cout << bin[i];

Wydaje mi się, że Twój problem wynikał z przekroczenia pamięci inta, dlatego nie ma sensu pozostawać przy tym rozwiązaniu. Dodam tylko, że są inne sposoby na wypisanie tych liczb w postaci binarnej.

0

@Tacet, Twój kod nie jest zły, ale nie wiadomo, po co kombinujesz ...

#include <iostream>
using namespace std;
 
int main()
  {
   int a;
   string bin;
   cout<<"==Program zamienia liczby dziesietne na binarne==\n\nPodaj liczbe w formacie dziesietnym: ";
   for(cin>>a;(a)||(!bin.size());a/=2) bin=((char)('0'+a%2))+bin;
   cout<<"Twoja liczba w postaci binarnej: "<<bin<<endl;
   return 0;
  }
0

Dzięki wielkie za pomoc! Rzeczywiście pomysł z wypisaniem stringa od tyłu jest chyba najbardziej logiczny.
No cóż, najprostsze rozwiązania są najtrudniejsze do wymyślenia:)

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