学习目标:高精度乘法
学习内容:高精度乘法
学习时间:每天
学习产出:手动
一.高精度 乘法原理
模拟现实乘法运算的原理
521
* 52
------------
1042
2605
-------------
27092
因为n位数×n位数可能出现大于等于n位数,用数组n1,n2逆序存储输入的数字
string s1,s2;
cin>>s1>>s2;
for(int i=0;i<s1.size();i++)
{
n1[s1.size()-1-i]=s1[i]-'0';
}
for(int i=0;i<s2.size();i++)
{
n2[s2.size()-1-i]=s2[i]-'0';
}
根据乘法的运算的规则满10进1所以可以得到
for(int i=0;i<s2.size();i++)//如521和52,52循环一次,521才变一个
{
for(int j=0;j<s1.size();j++)
{
s[i+j]=s[i+j]+n1[j]*n2[i];
s[i+j+1]=s[i+j+1]+s[i+j]/10;//满10进1;
s[i+j]%=10;
}
}
n位*n位,为数不会大于n*n+1故有
l=s1.size()*s2.size();
while(l&&s[l]==0)
{
l--;
}
for(int i=l;i>=0;i--)
cout<<s[i];
最后得到完整代码
#include <bits/stdc++.h>
using namespace std;
int n1[520],n2[520],s[520],l;
int main(){
string s1,s2;
cin>>s1>>s2;
for(int i=0;i<s1.size();i++)
{
n1[s1.size()-1-i]=s1[i]-'0';
}
for(int i=0;i<s2.size();i++)
{
n2[s2.size()-1-i]=s2[i]-'0';
}
for(int i=0;i<s2.size();i++)
{
for(int j=0;j<s1.size();j++)
{
s[i+j]=s[i+j]+n1[j]*n2[i];
s[i+j+1]=s[i+j+1]+s[i+j]/10;
s[i+j]%=10;
}
}
l=s1.size()*s2.size();
while(l&&s[l]==0)
{
l--;
}
for(int i=l;i>=0;i--)
cout<<s[i];
return 0;
}
谢谢大家的观看