Z dziesiętnego na ósemkowy

0

Mam problem z funkcją, która ma za zadanie zamienić podaną liczbę w systemie dziesiętnym na ósemkowy. Mój kod

unsigned long long 10_na_8(unsigned int liczba){
	if(liczba==0){
		return 0;
	}
	int wynik = liczba%8;
	liczba/=8;
	return 10_na_8(liczba);
	if(wynik<10){
	return 1;
	}
	else{
		char litera = wynik+55;
		return 1;
	}
	return 0;
}
0

Skompilowałeś go?

1

A jaki konkretnie masz problem?

0

Mój problem polega n atym, że jak wywołuję tą funkcję to wynik zawsze wynosi 0

0

Jaki kompilator skompilował kod z nazwą funkcji zaczynającą się od cyfry?
Poniżej tej linii nic się nie wykona:

return 10_na_8(liczba);
0

ale wynik 0, wychodzi po zmianie nazwy i nw co jest źle

0

Po wyrzuceniu linii nie wpływających na wynik:

unsigned long long 10_na_8(unsigned int liczba){
    if(liczba==0){
        return 0;
    }
    liczba/=8;
    return 10_na_8(liczba);
}
0

Tylko jak to zrobić reukurencyjnie? Bo nie wiem jak wyeliminować pętle żeby działało:/

0
return 10_na_8(liczba);

ta linijka wykonuje się bezwarunkowo, dlatego nic dziwnego, że zwraca 0, wartość, którą zwraca funkcja od razu, dla argumentu 0.

BTW. najprostsze rozwiązanie:

void print_oct(unsigned int n) {
    fprintf("%o\n", n);
}

ewentualnie użyj sprintf, jeśli chcesz utworzyć łańcuch znaków.

1

Rekurencyjnie, to:

int dec_to_any(int n,int base){
    if(n == 0)
		return n;
	else return (n % base) + dec_to_any(n / base, base) * 10;
}
2

Taka mała uwaga, że wcale nie zamieniasz liczby dziesiętnej na ósemkową.
unsigned int - to jest liczba dwójkowa ponieważ unsigned int składa się wewnętrznie z zer i jedynek, ponieważ tak komputer zapisuje informacje.

Więc twoja funkcja nie robi wcale tego, co ma robić. Albo źle podchodzisz do problemu albo problem jest źle nazwany.

lion137
dec_to_any

biorąc pod uwagę to, co robi ta funkcja, należałoby nazwać ją int_to_any, tylko, że dalej będzie to kłamstwo.

int dec_to_any(int n,int base){

Czyli funkcja bierze dwójkową liczbę n i zwraca inną dwójkową liczbę. I tylko przez przypadek działa, ale tylko dla wartości n < 11, bo później ci się cyfry skończą (do szesnastkowego tak nie skonwertujesz).

Tak na logikę, to tego typu funkcja powinna zwracać stringa, a nie inta, ponieważ to co robi to konwertuje jakąś wartość na tekst, który reprezentuje liczbę w danym układzie. Np. tak (kod w JavaScript):

function numberToString(n, base) {
    let s = '';   
    while (n) {
        const digit = n % base;
        n = (n - digit) / base;
        // 65 - czyli kod litery A
        s = (digit < 10? digit : String.fromCharCode(65 - 10 + digit)) + s;
    }
    return s;
}
2

Offtopic:
Zawsze mnie śmieszą funkcje o nazwach dec_to_XXX(int x).
Komputery, które używają systemu dziesiętnego wyszły już dawno z użytku (były takie cuda).
Sensowniej jakby nazywało się toHex(int x) albo toStringHex(int x).

A w c++ dec to oct nie wymaga wysiłku intelektualnego:

int x;
while(cin >> x) {
    cout << std::oct << x<< '\n';
}

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