Witam.
Mam problem. Piszę program, którego zadaniem jest mnożenie dwóch dużych liczb podanych na wejściu. Wszystko działa dobrze do pewnych danych, dalej wyniki się sypią. Nie bardzo wiem gdzie zawiniłem. Będę wdzięczny za wskazówki.
Kompilacja:
cc -ansi -Wall main.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
size_t r1 = 1, /* dlugosc pierwszej liczby */
r2 = 1, /* dlugosc drugiej liczby */
r3 = 1; /* dlugosc wyniku */
short *l1, *l2, *out, /* tablice przechowujace liczby i wynik */
T, /* ilosc zestawow */
znak = 0;
char c; /* wczytywany znak */
unsigned i, k; /* zmienne pomocnicze do sterowania petlami */
scanf("%hi\n", &T);
while(T--) {
/* allokacja pamieci dla tablic l1 i l2 */
l1 = (short *) malloc(r1);
l2 = (short *) malloc(r2);
/* wczytywanie liczb l1, l2 do tablic dynamicznych */
do {
c = getchar();
l1[r1-1] = c-48;
l1 = (short *) realloc(l1, (++r1) * sizeof(short));
} while(c != ' ');
do {
c = getchar();
l2[r2-1] = c-48;
l2 = (short *) realloc(l2, (++r2) * sizeof(short));
} while(c != '\n');
/* pomnozenie l1 przez l2 */
out = (short *) malloc(r3);
for(i=0 ; i<r1-2 ; i++) {
for(k=0 ; k<r2-2 ; k++) {
out[i+k] += l1[i] * l2[k];
if(i+k >= r3) {
out = (short *) realloc(out, (++r3) * sizeof(short *));
}
}
}
/* przepisywanie dziesiatek jezeli istnieja */
for(i=r3-1 ; i>=1 ; i--) {
switch(i) {
case 0: printf("%hi", out[i]); break;
default: out[i-1] += out[i] / 10; break;
}
out[i] %=10;
}
/* wyswietlenie wyniku */
if(out[r3-1] != 0) {
for(i=0 ; i<r3 ; i++) {
printf("%hi", out[i]);
}
} else {
putchar('0');
}
putchar('\n');
/* zresetowanie wartosci zmiennych dla nastepnego zestawu */
r1 = 1;
r2 = 1;
r3 = 1;
znak = 0;
free(l1);
free(l2);
free(out);
}
return 0;
}