Char to 8 bitów, więc może zawierać jedną z 255 ich kombinacji:
dwójkowo dziesiętnie
00000000 = 0
00000001 = 1
00000010 = 2
00000011 = 3
..........
00110000 = 48 --> '0' ASCII
......
11111111 = 255
Zadanie można zrobić na wiele sposobów, bez uciekania się do wskaźników.
Pewnie można też [nie robiłem] użyć algorytmu Karatsuby, ale trzeba wiedzieć dokładnie jak i na czym on polega. Można też, szkolnym sposobem mnożenia, mnożąc cyfra po cyfrze...
Właśnie, w celu przetestowania, zaliczyłem takim szkolnym [pisemnym] mnożeniem z czasem 1.41, ale pewnie można by jeszcze trochę pooptymalizować - wczytywałem liczby wolnymi-stringami. Jak mnożymy pisemnie, każdy pamięta. Tutaj należy maksymalnie zmniejszyć ilość działań a szczególnie dzieleń [modulo]. W takim razie, na początku, mnożymy po kolei cyfry, nie przejmując się przenoszeniem [nadmiarem], a każdy taki wynik dodajemy do kolejnej odpowiedniej komórki wyniku. Dopiero na końcu tym się zajmujemy - przenoszeniem wszystkich nadmiarów. Czy musimy "odwracać" dane [liczby i wynik]? Nie, przecież możemy poruszać się od końca, wykorzystując-zmniejszając odpowiednie indeksy. Przykład:
999 x 999
kolejne kroki mnożeń - zapis w komórkach wyniku
999 x
__9
0 0 0 0 0 81
0 0 0 0 81 81
0 0 0 81 81 81
+ 999 x
_9_
0 0 0 81 162 81
0 0 0 162 162 81
0 0 81 162 162 81
+ 999 x
9__
0 0 81 243 162 81
0 0 162 243 162 81
0 81 162 243 162 81
Dla większych [dłuższych] liczb, wyniki "cząstkowe" w poszzególnych komórkach mogą przekroczyć wartość 255, a więc w tym sposobie do przechowywania wyniku trzeba użyć tablicy intów - tablica charów będzie za mała.
Przeniesienie nadmiarów [od końca]
for (k = koniec; k >= początek; --k)
wynik[k-1] += wynik[k]/10; // --> I
wynik[k] = wynik[k] % 10; // --> II
// lub w skrócie wynik[k] %= 10;
0 81 162 243 162 81
0 81 162 243 170 81 --> I
0 81 162 243 170 1 --> II
0 81 162 260 170 1 --> I
0 81 162 260 0 1 --> II
0 81 188 260 0 1
0 81 188 0 0 1
0 99 188 0 0 1
0 99 8 0 0 1
9 99 8 0 0 1
9 9 8 0 0 1