高精度乘模板(十分简洁)
这个方法是先把字符串转化为了整形数组,然后模拟竖式乘法进行计算、
相比计较与把乘法转化为加法的方法,更加简洁,易懂,细节也更少,复杂度都与位数有关系
当仅仅用到高精度乘法时,用这个编码速度更快,不易错
当题目中同时要求用高精度的加法时,顺延之前的代码更方便
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 }


浙公网安备 33010602011771号