思路上比较简单,模拟小学乘法即可
需要注意的事项都在注释中
//高精度乘法 #include<iostream> #include<string> using namespace std; const int MAX=4010;//注意数据范围 string a,b; int lena,lenb; int num1[MAX]; int num2[MAX]; int sum[MAX]; int main(){ cin>>a>>b; lena=a.length(); lenb=b.length(); for(int i=1;i<=lena;i++){//倒序读入 num1[i]=a[lena-i]-48; } for(int i=1;i<=lenb;i++){ num2[i]=b[lenb-i]-48; } int len=lena+lenb,add=0,index;//结果最大不超过长度为len,add表示进数,index表示每组结果开始的下标 for(int i=1;i<=lenb;i++){ index=i; add=0; for(int j=1;j<=lena;j++,index++){ sum[index]+=((num2[i]*num1[j]+add)%10); add=(num2[i]*num1[j]+add)/10; } if(add!=0){ sum[index]=add; } } add=0; for(int i=1;i<=len;i++){ int temp=sum[i];//注意这里要保留原来的数字 sum[i]=(sum[i]+add)%10; add=(temp+add)/10;//才能保证这里的数据不被上面一行刷掉 } int start=len; while(start>0&&!sum[start]){//注意可能存在结果的前面全是0的情况,我们需要将其忽略,如1000*0 start--; } if(start==0){ cout<<0<<endl; return 0; } for(int i=start;i>=1;i--){ cout<<sum[i]; } cout<<endl; return 0; }
A*B Problem(模拟)
最新推荐文章于 2024-10-01 23:05:47 发布