Programowanie i algorytmy

KONKURS FRAKTAL

fraktal

VII edycja konkursu programistycznego

FRAKTAL

8-9 kwietnia 2017

czytaj więcej

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 {tex}p{/tex}, gdzie

{tex}p\ \epsilon\ \{2, 3, ..., 15, 16\}{/tex}

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

Przeanalizujmy kilka przypadków:

zamieńmy liczbę {tex}100{/tex} na system trójkowy:

systemy pozycyjne

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

{tex}100=(10201)_3{/tex}

Przedstawmy teraz liczbę {tex}1201{/tex} w systemie szesnastkowym:

systemy pozycyjne

Wynik spisujemy od końca i otrzymujemy:

{tex}1201 = (4B1)_{16}{/tex}

Problem rozwiążemy rekurencyjnie.

Dane wejściowe

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

Dane wyjściowe

Liczba {tex}n{/tex} zapisana w systemie o podstawie {tex}p{/tex}.

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;    
}