zoukankan      html  css  js  c++  java
  • 高精度运算专题3-乘法运算(The multiplication operation)

    这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面

    函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了。

    ①记录数组a、数组b的长度,放到第一位

    ②每个位相乘,用一个数来记录进位(初值为0),每个位相乘,加上进位,存入c数组的相对应的位置,每次进位要重新赋值

    ③最后记得要去掉最高位的0,并把c数组的长度存到第一号位置(c[0])

    代码如下:

     1 void mul(char strA[],char strB[],int c[])//正整数的高精度运算 a*b ---> c
     2 {
     3     int a[MaxLength],b[MaxLength];
     4     int i,j,x,lenc;
     5     memset(a,0,sizeof(a));//测a长度 
     6     memset(b,0,sizeof(b));//测b长度 
     7     memset(c,0,sizeof(c));//测c长度 
     8     init(strA,a);//a转换成数字 
     9     init(strB,b);//b转换成数字 
    10     for(i=1;i<=a[0];i++)
    11     {
    12         x=0;//表示进位,记录 
    13         for(j=1;j<=b[0];j++)//重要的在这里 
    14         {
    15             c[i+j-1]+=a[i]*b[j]+x;//每个位相乘,加上进位存入c数组 
    16             x=c[i+j-1]/10;//x重新赋值为进位 
    17             c[i+j-1]=c[i+j-1]%10;//保留1位 
    18         }
    19         c[i+b[0]]=x;//表示进位(向c的更高位进位)
    20     }
    21     lenc=a[0]+b[0];//c的长度就是a+b的长度 
    22     while(c[lenc]==0&&lenc>1)  lenc--;//去除高位上多余的0 
    23     c[0]=lenc;
    24 }

    函数2思路:这个函数与函数1没什么太大区别,只是传入的数组类型不一样而已,这个函数不用把字符串数组转换成数字数组,直接计算即可

    代码如下:

     1 void mul2(int a[],int b[],int c[])//正整数的高精度运算 a*b ---> c
     2 {
     3     int i,j,x,lenc;
     4     memset(c,0,sizeof(c));
     5     for(i=1;i<=a[0];i++)
     6     {
     7         x=0;//表示进位
     8         for(j=1;j<=b[0];j++)
     9         {
    10             c[i+j-1]=c[i+j-1]+a[i]*b[j]+x;
    11             x=c[i+j-1]/10;
    12             c[i+j-1]=c[i+j-1]%10;
    13         }
    14         c[i+b[0]]=x;//表示进位(向c的更高位进位)
    15     }
    16     lenc=a[0]+b[0];//c的长度就是a+b的长度 
    17     while(c[lenc]==0&&lenc>1)  lenc--;//去除高位上多余的0 
    18     c[0]=lenc;
    19 }
  • 相关阅读:
    .NET旋转PDF并保存旋转结果到文件
    C#的抽象类和接口的区别,在什么时候使用才合适?
    [转]SQL Server中多行多列连接成为单行单列
    VBS脚本COPY指定日期文件及文件夹
    eval同时绑定两个值:通过String.Format给超链接中的两个参数赋值
    How to recover SA password on Microsoft SQL Server 2008 R2
    [转]asp.net 前台绑定后台变量方法总结:<%= %> 和<%# %>的区别
    Js得到radiobuttonlist选中值的两种方式
    Ameriscan增加一个新的client:AP_CONSO
    命令行处理pdf的利器:PDFTK.exe
  • 原文地址:https://www.cnblogs.com/geek-007/p/4374815.html
Copyright © 2011-2022 走看看