写完高精度加法,有了一点经验,然而出了更多的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;
}
pmul