Pozycyjne reprezentacje liczb

powrót

Problem zamiany liczby dziesiętnej na binarną został omówiony w tym miejscu.

W tym artykule omówimy zamianę z systemu dziesiętnego na dowolny system o podstawie $$p$$, gdzie

$$p\ \epsilon\ \{2, 3, ..., 15, 16\}$$

Rozwiązanie zagadnienia jest analogiczne do zamiany z systemu dziesiętnego na binarny. Liczbę w systemie dziesiętnym skracamy, dzieląc przez podstawę $$p$$ do momentu uzyskania wartości $$0$$. Po prawej stronie wypisujemy reszty z dzielenia przez $$p$$. Rozwiązaniem będzie spisanie wartości znajdujących się po lewej stronie w odwrotnej kolejności.

Przeanalizujmy kilka przypadków:

zamieńmy liczbę $$100$$ na system trójkowy:

systemy pozycyjne

Następnie spisujemy wynik od końca i otrzymujemy:

$$100=(10201)_3$$

Przedstawmy teraz liczbę $$1201$$ w systemie szesnastkowym:

systemy pozycyjne

Wynik spisujemy od końca i otrzymujemy:

$$1201 = (4B1)_{16}$$

Problem rozwiążemy rekurencyjnie.

Dane wejściowe

Dwie liczby:$$n\ \epsilon\ N$$, oraz $$p \epsilon \{2,\ 3,\ ...,\ 16\}$$.

Dane wyjściowe

Liczba $$n$$ zapisana w systemie o podstawie $$p$$.

Rozwiązanie w C++:

#include<iostream>
#include<cstdlib>
using namespace std;

void zamiana(long long n, int p)
{
     if(n>0)
     {
            zamiana(n/p,p);
            if(n%p>9)
//dla systemów o podstawie większej niż 9 cyfry są literami
                     switch(n%p) 
                     {
                                case 10:
                                     cout<<"A";
                                     break;
                                case 11:
                                     cout<<"B";
                                     break;
                                case 12:
                                     cout<<"C";
                                     break;
                                case 13:
                                     cout<<"D";
                                     break;
                                case 14:
                                     cout<<"E";
                                     break;
                                case 15:
                                     cout<<"F";
                                     break;
                     }
           else
               cout<<n%p;
     }
}

int main()
{
    int p;
    long long n;
    
    cout<<"Podaj liczbę i podstawę systemu: ";
    cin>>n>>p;
    
    cout<<"Liczba "<<n<<" w systemie "<<p<<": ";
    
    if(n==0)
        cout<<0;
    else
        zamiana(n,p);
    
    cout<<endl;    
    system("pause");
    return 0;    
}