[C++] Wczytywanie dlugiej liczby do tablicy


(Krzkaczor) #1

Hej!

Chcę wczytać załóżmy 200 znakową liczbe do tablicy i nastepnie wykonac na niej pewne operacje. Mam taki kod:

#include 

int main() {

    char aNumber1[200];

    char aNumber2[200];

    int e = 0;

    int f = 0;

    int temp;

    char c;

    //wczytywanie liczb

    printf("Podaj pierwsza liczbe:");

    for(scanf("%c", &c); c!='\n'; scanf("%c", &c))

        aNumber1[e++]=c; //probowalem rzutowac tu na int

    printf("Podaj druga liczbe:");

    for(scanf("%c", &c); c!='\n'; scanf("%c", &c))

        aNumber2[f++]=c;


    for (int i=e-1;i>=0;i--) {

        temp = aNumber1[i] + aNumber2[i];

        printf("%d - %c\n",i,temp);

    }

    printf("-----\n%c\n",aNumber1[0]);


}

Liczby są dobrze zapisane do tablicy lecz wykonanie na nich operacji konczy sie wypisaniem liter :smiley: (przynajmniej w moim przypadku). Jak sobie z tym poradzic?

Prosze o pomoc i pozdrawiam


(Ryan) #2

Każdy wbudowany typ liczbowy ma limity. Liczby zapisywane są na 1, 2, 4 lub 8 bajtach. Maksymalna wartość, jaką można zapisać na k bajtach zmiennej bez znaku to 2^(8*k) - 1, czyli dla 8 bajtów (unsigned long long) to 18446744073709551615. Jak widać liczba ma raptem 20 znaków. Aby wykonywać operacje na liczbach, które w systemie dziesiętnym mają ponad 20 znaków potrzebujesz nowego typu i definicji operacji na nim (+-*/). Jeśli się nie mylę proponowany dla C++ Decimal128 będzie wciąż za mały, więc jesteś skazany na własną implementację (albo bibliotekę 3rd party).

Jeśli nie zależy Ci na wysokiej precyzji wyniku, w pewnym zakresie możesz użyć liczb zmiennoprzecinkowych. Niestety float pozwala na zapis liczb do około 3*10^38, więc też jest za mały. Double jest większy: ~2*10^308. Przypominam jednak, że poświęcasz precyzję.


(Krzkaczor) #3

No wiem właśnie że każdy typ ma ograniczenia dlatego właśnie chcę zapisać wszystkie cyfry do tablicy (i bede miec ograniczenie do 200 cyfr co mnie satysfakcjonuje). Tylko jak to zrobić?


([alex]) #4

Ten fragment kodu trzeba przerobić cały, ja jedynie poprawiłem najbardziej groźne błędy.

#include int main()  {   char aNumber1[200],aNumber2[200],aNumber3[201],c;   int e=0,f=0,g=0,p=0;

(Krzkaczor) #5

Działa :smiley: Dzięki wielkie!


(Ryan) #6

Są dwa problemy. Pierwszy: reprezentowanie liczb w ten sposób nie jest zbyt efektywne. Drugi: jak chcesz na tych liczbach wykonywać operacje bardziej złożone niż ich wyświetlanie, dodawanie i odejmowanie - ilość kodu do obsługi wzrośnie Ci lawinowo. (z drugiej strony fajnie czasem zaimplementować mnożenie pod kreskę...)