简单高精度乘法
涉及到较大数字的乘法,往往不能简单地使用int ,或者long long来解决,高精度乘法就是来模拟我们自己做乘法运算。
下面,以 789x89 =70,221 为例,解释简单高精度乘法的算法。
本文是博主作为C++初学者的第一篇博客,有感而写,其中有不严谨之处还望多多指教~
7 8 9
x 8 9
72 81
64 72 (用一个二维数组存)
56 63
——————— (每一列求和)
56 127 144 81 【1】(再进位)
7 0 2 2 1 【2】
下面是高精度乘法代码,已经过Dev C++ 调试
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
using namespace std ;
int sum[200][200] ;
int main()
{
string s1 , s2 ; //用字符串来存两个乘数
cin >> s1 >> s2 ;
memset( sum , 0 , sizeof(sum)) ; //初始化为0
int res[250]= {0} ; //存最终结果
int len1 = s1.size() , len2 = s2.size();
reverse( s1.begin() ,s1.end() ) ; //翻转两个字符串
reverse( s2.begin() ,s2.end() ) ;
int i , j ;
int k = len1+len2-2 ; // 【1】状态的位数
for( i=0 ; i<len1; i++)
{
for( j=0; j<=k; j++)
{
if( j<len2+i)
sum[i][j+i] = ( s1[i]-'0') * ( s2[j]-'0') ; //模拟手算,填充二维维数组
else
sum[i][j] = 0 ; // 其余补空为0
}
}
//列求和
for( int u=0; u<=k ; u++) //列数
{
for(int v=0; v<len1 ; v++) //行数
{
res[u] += sum[v][u] ;
}
}
//进位
for(int u=0; u<=k; u++)
{
res[u+1] += res[u]/10 ;
res[u] %= 10 ;
if( res[k+1]!=0 )
{
k++ ;
}
}
//逆序输出
for( int u=k; u>=0; u-- )
{
cout <<res[u] ;
}
cout <<endl ;
}
程序调试截图: