Witam
Od dłuższego czasu męczę się nad napisaniem mnożenia dużych liczb.
Niestety nie zawsze mój program daje dobre odpowiedzi :(
Jeżeli ktoś pomoże odnaleźć błąd będę wdzięczny.
#include <cstdio>
#include <cstring>
const int base=1000000000;
const int cyfr=9;
const int max=10000;
const int maxdlugosc=10002;
struct liczba
{
int dlugosc;
int dane[max];
};
liczba toLiczba(char x[])// zmienna znakowa zamieniam na typ liczba
{
int i,n,pot;
liczba wynik;
wynik.dlugosc=0;
n=strlen(x);
for(i=0;i<n;i++)
{
if(i%cyfr==0)
{
pot=1;
wynik.dlugosc++;
wynik.dane[i/cyfr]=0;
}
wynik.dane[i/cyfr]+=(x[n-i-1]-'0')*pot;
pot*=10;
}
return wynik;
}
void wypisz(liczba x) //funkcja wypisuje dane typu liczba
{
int i;
printf("%d",x.dane[x.dlugosc-1]);
for(i=x.dlugosc-2;i>=0;i--)
{
printf("%0*d",cyfr,x.dane[i]);
}
printf("\n");
}
liczba pomnoz(liczba a, liczba b)
{
int x,y;
unsigned long long temp, dalej;
int i,j;
liczba wynik;
wynik.dlugosc=0;
x=a.dlugosc;
y=b.dlugosc;
temp=0;
dalej=0;
for(i=0;i<x;i++)
{
j=0;
++wynik.dlugosc;
wynik.dane[wynik.dlugosc-1]=dalej;
dalej=0;
while(j<=i&&j<y)
{
temp=(long long )a.dane[i-j]*b.dane[j];
dalej+=(wynik.dane[wynik.dlugosc-1]+temp)/base;
wynik.dane[wynik.dlugosc-1]=(wynik.dane[wynik.dlugosc-1]+temp)%base;
j++;
}
}
for(i=1;i<y;i++)
{
j=x-1;
++wynik.dlugosc;
wynik.dane[wynik.dlugosc-1]=dalej;
dalej=0;
while(j>=0&&(x-j)<y)
{
temp=(long long)a.dane[j]*b.dane[x-j];
dalej+=(wynik.dane[wynik.dlugosc-1]+temp)/base;
wynik.dane[wynik.dlugosc-1]=(wynik.dane[wynik.dlugosc-1]+temp)%base;
j--;
}
}
if(dalej>0)
{
wynik.dane[wynik.dlugosc++]=dalej;
}
return wynik;
}
int main()
{
char s1[maxdlugosc];
liczba l1,l2;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s1);
l1=toLiczba(s1);
scanf("%s",s1);
l2=toLiczba(s1);
wypisz(pomnoz(l1,l2));
}
return 0;
}