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 » |