自然數高精度乘法
阿新 • • 發佈:2020-10-15
寫完高精度加法,有了一點經驗,然而出了更多的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[5005pmul],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; }