2012-06-14 12 views
5

Co to jest skalowalny algorytm do drukowania N-liczbowo-binarnych liczb całkowitych ręcznie, którego wartość nie mieści się w long long. Wiem printf i przyjaciele, wraz z <iostream> (który najprawdopodobniej świnka-beki na <cstdio> mieć to polecenie wbudowane do standardowych typów, ale chciałbym to zrobić za całkowitą złożonej z N bajtów.ręczne drukowanie liczby całkowitej N-bajtowej

myślałem o tym i googled trochę, ale zawsze sprowadza się do korzystania z wcześniej istniejących big libirary jak GMP (kod źródłowy, którego w ogóle nie znam) lub "use printf" lub najbardziej pomocny "to jest trudne". liczba całkowita jest zasadniczo:

template<size_t N> 
class Integer{ 
... 
private: 
    int8_t first; 
    uint8_t rest[N-1]; 
} 

tak interpretuje wykonania Integer<4> „s bajtów w może ci dać int32_t. Chciałbym skalować to do N> 8. Wydajność w tej chwili nie jest moim problemem. Nie jest to endianness (dotyczy to x86).

+2

Zakładam, że musisz wydrukować liczbę w systemie dziesiętnym? – NPE

+0

@aix tak dziesiętny byłby ideą. – rubenvb

+0

Moja rada byłaby w każdym razie korzystania z biblioteki bigint; te biblioteki są debugowane i sprawdzone. Jak znajdziesz błędy we własnym kodowaniu? To nie jest tak, że zamierzasz zweryfikować wyniki piórem i papierem lub w Excelu. – tomdemuyt

Odpowiedz

5

Krok 1: Definiowanie tabeli odnośników zawierających uprawnienia dwa w formacie ciągu:

const char * const powers_of_two[] = {"1", "2", "4", "8", "16", "32", "64", ...}; 

Krok 2: Napisz funkcję, która dodaje dwie liczby w formacie strun.

Krok 3: Powtórz bity w swoim numerze i dodaj wszystkie ciągi odpowiadające 1 bitowi.

Krok 4: Wydrukuj wynik.

Sam stosowałem to podejście do drukowania bardzo dużych liczb zmiennoprzecinkowych i działało dobrze dla mnie.

+0

Bardzo sprytny Fred! –

+2

Nie potrzebujesz nawet tabeli uprawnień 2: po prostu dodaj liczbę do siebie, aby pomnożyć ją przez 2; dodaj 1 do liczby, jeśli bit wynosi 1; repeat ==> profit – anatolyg

+0

Zauważ, że działa on tylko dla liczb dodatnich, chociaż można to łatwo naprawić. Znakomity. –

2

Podstawowy algorytm rekurencyjny do wyprowadzania liczbę dziesiętną:

void negate(Integer & number); // modifies the input 
int divide_by_10(Integer & number); // modifies the input 
bool is_zero(const Integer & number); 

void output_number(Integer number) 
{ 
    if (number.first < 0) 
    { 
     cout << "-"; 
     negate(number); 
    } 
    if (is_zero(number)) 
    { 
     cout << "0"; 
     return; 
    } 
    int remainder = divide_by_10(number); 
    if (!is_zero(number)) 
     output_number(number); 
    char digit[] = {'0', 0}; 
    digit[0] += remainder; 
    cout << digit; 
} 

Zostawiłam funkcje pomocnicze niezdefiniowane teraz, być może to wystarczy.

+0

Dzięki. Nie mam arytmetyki (chciałem najpierw zobaczyć wynik), więc spróbuję najpierw sugestii Freda. Mogę później porównać działanie obu podejść. – rubenvb

Powiązane problemy