Zamiana systemów liczbowych
Ostatnio zmodyfikowano 2017-05-07 21:02
tymet Temat założony przez niniejszego użytkownika  | 
Zamiana systemów liczbowych » 2017-05-07 15:07:47 Napisałem taki program zamieniający system dziesiętny na dwójkowy: #include <iostream> #include <math.h>
  using namespace std;
  int main() {     cout << "Zamiana systemu dziesietnego na dwojkowy" << endl;     cin.get();     int liczba, liczba2, y, a, b, mi, x, w, w2;
      b=1;     while (b==1)     {     cout<<"Podaj liczbe w systemie dziesietnym"<< endl;     cin>>liczba;     liczba2=liczba;     y=0;
 
      do     {     x=pow(2,y);     mi=liczba-x;     if (mi>=x)     {         y++;         a=0;     }
 
      else     {         a=1;
      }     }while(a==0);
      w=0;     while (!(y==-1))     {     x=pow(2,y);     if (liczba>=x)     {            liczba=liczba-x;             w2=1;     }     else     {         w2=0;     }     y--;     w=10*w+w2;
      }
      cout<<"Liczba "<<liczba2<<" w systemie dwojkowym ma zapis "<<w<< endl;     cin.get();     cout<<"Chcesz kontynuowac - wybierz 1, chcesz zakonczyc - wybierz 0"<<endl;     cin>>b;     }
 
      return 0; } Wiem, że jest topornie wykonany, ale dopiero się uczę. Program działa poprawnie dla liczb mniejszych niż 1024. Dla 1024 i większych wyrzuca dziwne liczby. Gdzie popełniłem błąd?
   | 
 | 
mateczek  | 
» 2017-05-07 16:34:35 dlaczego tak skomplikowanie?? Algorytm ciężki do analizy. Nazwy zmiennych liczba2, y, a, b, mi, x, w, w2; nic nie mówią o ich przeznaczenu. kod wstawiaj w znaczniki  [cpp]tutaj kod c++[/cpp]  Algorytm generujący reprezentację dwójkową liczby "int" to sprawdzanie reszty z dzielenia przez 2 i wstawianie tejże reszty na początek stringa. (Jak za 2 wstawisz 8 to otrzymasz zapis ósemkowy)  #include <iostream> using namespace std; int main() {     int liczbaDzies;     cin >> liczbaDzies;     string liczbaBin;     while( liczbaDzies ) {         liczbaBin.insert( liczbaBin.begin(), liczbaDzies % 2 + '0' );         liczbaDzies /= 2;     }     cout << liczbaBin << endl; }
  Dla systemu dwójkowego możesz zamiast sprawdzać resztę testować ostatni bit np instrukcją   liczbaDzies&1  a zamiast dzielić przez 2 przesuwać w prawo instrukcją  liczbaDzies>>=1 #include <iostream> using namespace std; int main() {     int liczbaDzies;     cin >> liczbaDzies;     string liczbaBin;     while( liczbaDzies ) {         liczbaBin.insert( liczbaBin.begin(),( liczbaDzies & 1 ) + '0' );         liczbaDzies >>= 1;     }          cout << liczbaBin << endl; }
  Problem z twoim algorytmem jest taki, że nie generujesz stringa dla liczby zapisanej w pamięci, Ale zamieniasz liczbę na inną np liczbę "9" słownie dziewięć przekształcasz w liczbę "1001" słownie: "tysiąc jeden"  i tutaj ograniczeni typu int który pmieści maksymalnie 2147483647  !!!  long long liczba, liczba2, y, a, b, mi, x, w, w2;
 
   | 
 | 
tymet Temat założony przez niniejszego użytkownika  | 
» 2017-05-07 21:02:53 Wielkie dzięki za pomoc  | 
 | 
|  « 1 »  |