众所周知,在计算机中数字的表示范围是有限的,比如我们熟知的int,float,double等数据类型所能表示的范围都是有限的,如果我们要对位数达到几十位,几百位,甚至是上千位的大整数进行计算,这些数据类型显然不能满足我们的要求,因此我们应该如何实现大数的计算呢。
之前讨论了大数的加减运算,大数加减法通过模拟加减运算的法则,使用数组存储不同阶位,在计算中同阶位进行运算,并根据计算进行进位或借位。大数乘法与加减法类似,根据乘法的竖式运算法则,进行运算。只不过在计算过程中的进位单独处理。
用第一个数的第i为和另一个数的第j位相乘时所得的数,要加到第i+j位上,即要考虑运算时的错位。另外,进位处理时进位的值加上当前的值要可能会以溢出(即大于10),需要考虑是否继续进位。
下面给出代码(只给函数,不给主函数)(注:下面的代码是参考百度写的,测试成功,如有不足,自己百度)
int Mul(char num1[],char num2[], int sum[])
{
int i, j, len, len1, len2;
int n1[MAX+10] = {0};//用于储存num1转换整数型后的数据
int n2[MAX+10] = {0};//用于储存num2转换整数型后的数据
int c[MAX*2+10] = {0};
len1 = strlen(num1);
for(j = 0, i = len1-1; i >= 0; i--) //把num1中的数字字符转换为整型
{
n1[j++] = num1[i]-'0';
}
len2 = strlen(num2);
for(j = 0, i = len2-1; i >= 0; i--)//把num2中的数字字符转换为整型
{
n2[j++] = num2[i]-'0';
}
for(i = 0; i < len2; i++)//用第二个数乘以第一个数,每次一位
{
for(j = 0; j < len1; j++)
{
c[i+j] += n2[i] * n1[j]; //先乘起来,后面统一进位
}
}
for(i=0; i<MAX*2; i++) //循环统一处理进位问题
{
if(c[i]>=10)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
for(i = MAX*2; c[i]==0 && i>=0; i--); //跳过高位的0
len = i+1; // 记录结果的长度
for(; i>=0; i--)
{
sum[i]=c[i];
}
return len;
}