写完高精度加法,有了一点经验,然而出了更多的bug QAQ
包括但不仅限于子函数内声明二维数组爆栈、计算结果的1位迷之错误、暂存和(sumn)忘记重置、0作乘数时结果位要-1、把增加结果位数放错位置
喵的 洛谷的数据有点小弱,把ac的初代代码用在别的题里,各种各样的bug就出来了。查了半天才发现是高精度乘法写的有问题。下附修正版。欢迎指正。
#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<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]=con;maxl++;} 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; } 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; }