Program nie działa dla zamiany liczb z dziesiętnego na szesnastkowy

0

Chciałem napisać program który zamienia liczby z systemu dziesiętnego na szesnastkowy jednak kompletnie nie wiem jak sie do tego zabrać...Napisałem takie coś, działa dla binarnego jednak ten szesnastkowy kompletnie się wywala...

#include <iostream>

using namespace std;

void binarny(int liczba){
    const int MAX=100;
    int tab[MAX],i=0;
    while(liczba){
        tab[i++]=liczba%2;
        liczba/=2;
    }
    for(int j=i-1; j>=0;j--){
        cout<<tab[j];
    }
}
void szesnastkowy(int liczba){
    const int MAX=100;
    int tab[MAX],i=0,buffor;
    while(liczba){
        buffor=liczba%16;
        if(buffor==0) tab[i++]=0;
        else if(buffor%16==1) tab[i++]=1;
        else if(buffor%16==2) tab[i++]=2;
        else if(buffor%16==3) tab[i++]=3;
        else if(buffor%16==4) tab[i++]=4;
        else if(buffor%16==5) tab[i++]=5;
        else if(buffor%16==6) tab[i++]=6;
        else if(buffor%16==7) tab[i++]=7;
        else if(buffor%16==8) tab[i++]=8;
        else if(buffor%16==9) tab[i++]=9;
        else if(buffor%16==10) tab[i++]='A';
        else if(buffor%16==11) tab[i++]='B';
        else if(buffor%16==12) tab[i++]='C';
        else if(buffor%16==13) tab[i++]='D';
        else if(buffor%16==14) tab[i++]='E';
        else if(buffor%16==15) tab[i++]='F';
        liczba/=16;
    }
    for(int j=i-1; j>=0;j--){
        cout<<tab[j];
    }
}
int main()
{
    int liczba;
    cout<<"Podaj liczbe: ";
    cin>>liczba;
    binarny(liczba);
    cout<<endl;
    szesnastkowy(liczba);
    return 0;
}
1

Masz tablicę intów i po przypisaniu 'A' dostajesz na wyjście ASCII danego znaku. Zmień sobie typ na char.

2

Tak jak powyżej, albo użyć stringów:

#include <iostream>
#include <string>
#include <stack>
#include <assert.h>

using namespace std;

string dec_to_any(int n, int base){
	string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 36 znaków - zmiana do base 36 
	stack<int> remainder; // stos na reszty, żeby nie uzywać rekurencji 
	int rem = 0;
	while (n > 0) { 
					
		rem = n % base;
		remainder.push(rem);
		n = n / base;
	}

	string out_string = "";
	while ( !(remainder.empty())){
		out_string += digits.at(remainder.top());
		remainder.pop();
	}
	return out_string;
}
0

@lion137: bez sensu masz stos:

// Liczba nie jest zapisana dziesiętnie tylko binarnie, więc nazwa jest trochę myląca, jako, że `to_base(0xFF, 16)` da w wyniku `FF`.
string to_base(int n, size_t base) {
    static char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    assert(base > 0 && base <= sizeof(digits) / sizeof(digits[0]));
    bool neg = false;
    std::string data;
    if (n < 0) {
        n = -n;
        neg = true;
    }

    while (n > 0) {
        data.insert(0, 1, digits[n % base]);
        n /= base;
    }

    if (neg) data.insert(0, 1, '-');
 
    return data;
}
0

@lion137: bez sensu masz stos: ...
Mógłbyś wyjaśnić? Funkcja pobiera liczbę w systemie dziesiętnym oraz bazę, zwraca, przepisaną do danej bazy jako string; przechodzi mi testy, wygląda, że jest OK.

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