高精度——大数乘法
方法:
先不算任何的进位,将每一位相乘,相加的结果保存到同一个位置,到最后才计算进位。
//对于数组a,b都是正序的情况
void mult(char a[],char b[])
{//al表示被乘数的位数,bl表示乘数的位数
int i,j,k;
int al = strlen(a);
int bl = strlen(b);
int t[al+bl];
int tl;
memset(t,0,sizeof(t));
for(i = 0;i<al;i++)
for(j = 0;j<bl;j++)
t[i+j+1] += (a[i]-'0')*(b[j]-'0');
//注意是i+j+1
//进行进位操作
tl = al+bl-1;
for(i = tl;i>=1;i--)
{
t[i-1] +=t[i]/10;
t[i] = t[i]%10;
}
//判断首位是不是零
if(t[0] == 0)
i = 1;
else
i = 0;
j = 0;
for(;i<=tl;i++)
c[j++] = t[i]+'0';
c[j] = '\0';
}
char c[N];
//对于数组a,b都是逆序的情况
void mult(char a[],char b[])
{
int i,j,k;
int al = strlen(a);
int bl = strlen(b);
int t[al+bl];
int tl;
memset(t,0,sizeof(t));
for(i = 0;i<al;i++)
for(j = 0;j<bl;j++)
t[i+j] += (a[i]-'0')*(b[j]-'0');
//进行进位操作
tl = al+bl-1;
for(i = 0;i<tl;i++)
{
t[i+1] +=t[i]/10;
t[i] = t[i]%10;
}
if(t[tl] != 0)
tl++;
j = 0;
for(i = tl-1;i>=0;i--)
{
c[j++] = t[i]+'0';
}
c[j] = '\0';
return;
}