高精度乘模板(十分简洁)

这个方法是先把字符串转化为了整形数组,然后模拟竖式乘法进行计算、

相比计较与把乘法转化为加法的方法,更加简洁,易懂,细节也更少,复杂度都与位数有关系

当仅仅用到高精度乘法时,用这个编码速度更快,不易错

当题目中同时要求用高精度的加法时,顺延之前的代码更方便

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int L=500;//设置高精度乘法长度 
 5 string mul(string a,string b)
 6 {
 7     string s;
 8     int na[L],nb[L],nc[L],La=a.size(),Lb=b.size();
 9     //将na,nb,nc置为全0
10     //nc用于存储乘积 
11     fill(na,na+L,0);
12     fill(nb,nb+L,0);
13     fill(nc,nc+L,0);
14     //将字符串转为整型数据,倒序 
15     for(int i=La-1;i>=0;i--) na[La-i]=a[i]-'0';
16     for(int i=Lb-1;i>=0;i--) nb[Lb-i]=b[i]-'0';
17     //按位模拟竖式乘法 
18     for(int i=1;i<=La;i++)
19     {
20         for(int j=1;j<=Lb;j++)
21         {
22             nc[i+j-1]+=na[i]*nb[j];//注意加号 
23         }
24      } 
25     //进位 
26      for(int i=1;i<=La+Lb;i++)
27      {
28          nc[i+1]+=nc[i]/10;
29          nc[i]%=10;
30      }
31      //判断La+Lb位上是否为0 
32      if(nc[La+Lb]) s+=nc[La+Lb]+'0';
33      //将整形转换为字符串 
34      for(int i=La+Lb-1;i>=1;i--)
35      {
36          s+=nc[i]+'0';
37      }
38      return s;
39  }
40  int main()
41  {
42      string a,b;
43      cin>>a>>b;
44      cout<<mul(a,b)<<endl;
45      return 0;
46  }

 

posted @ 2022-06-27 20:06  格蕾  阅读(252)  评论(0)    收藏  举报