大数四则运算之大数乘法

        众所周知,在计算机中数字的表示范围是有限的,比如我们熟知的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; 
}

猜你喜欢

转载自blog.csdn.net/qq_42057046/article/details/88700731
今日推荐