1. 程式人生 > 實用技巧 >自然數高精度乘法

自然數高精度乘法

寫完高精度加法,有了一點經驗,然而出了更多的bug QAQ

包括但不僅限於子函式內宣告二維陣列爆棧、計算結果的1位迷之錯誤、暫存和(sumn)忘記重置、0作乘數時結果位要-1

喵喵的

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int temp[5005][5005];
int pmul(char s1[],char s2[],int ans[])
{
    int len1=strlen(s1),len2=strlen(s2);
    int num1[5005
],num2[5005]; int con=0,sum; for(int i=0;i<len1;i++) num1[len1-1-i]=s1[i]-'0'; for(int i=0;i<len2;i++) num2[len2-1-i]=s2[i]-'0'; if(len1<len2) { swap(num1,num2); swap(len1,len2); } int maxl=len1+len2-1; for(int i=0;i<len2;i++) for(int j=0;j<maxl;j++) temp[j][i]
=0; for(int i=0;i<len2;i++) { for(int j=0;j<len1;j++) { sum=num1[j]*num2[i]+con; con=sum/10; sum=sum-sum/10*10; temp[j+i][i]=sum; } if(con>0) temp[len1+i][i]=con; con=0; } int sumn=0; con=0;
for(int i=0;i<maxl;i++) { for(int j=0;j<len2;j++) sumn+=temp[i][j]; sumn+=con; con=sumn/10; sumn=sumn-sumn/10*10; ans[i]=sumn; sumn=0; } if(con>0) { ans[maxl]=con; maxl++; } int tempans[5005]; for(int i=0;i<maxl;i++) tempans[i]=ans[i]; for(int i=0;i<maxl;i++) ans[i]=tempans[maxl-1-i]; return maxl; } int main() { char a[5005],b[5005]; int ans[5005]; cin>>a>>b; if(a[0]=='0'||b[0]=='0') { cout<<0; return 0; } int ll=pmul(a,b,ans); for(int i=0;i<ll;i++) printf("%d",ans[i]); return 0; }
pmul