求助大佬,不明白为什么只过了一个点:(
  • 板块P1303 A*B Problem
  • 楼主Miier
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/7/22 09:57
  • 上次更新2023/10/27 18:58:25
查看原帖
求助大佬,不明白为什么只过了一个点:(
582772
Miier楼主2022/7/22 09:57
#include <stdio.h>
#include <string.h>
typedef struct
{
    int num[11000];
    int len;
    int neg;
}BIGINT;
BIGINT str2int(char* p);
BIGINT add(BIGINT a,BIGINT b);//高精度加法
BIGINT sub(BIGINT a,BIGINT b);//高精度减法
BIGINT mul(BIGINT a,BIGINT b);//高精度乘低精度
int main()
{
    char sa[11000],sb[11000];
        scanf("%s %s",sa,sb);
        BIGINT ia=str2int(sa),ib=str2int(sb);
        BIGINT ans=mul(ia,ib);
        if(ans.neg) printf("-");
        for(int i=ans.len-1;i>=0;i--)  printf("%d",ans.num[i]);
}
BIGINT str2int(char* p)
{
    BIGINT ans={{0},0,0};
    for(int i=strlen(p)-1;i>=0;i--)
    {
        ans.num[ans.len++]=p[i]-'0';
    }
    return ans;
}
BIGINT add(BIGINT a,BIGINT b)
{
    int len=a.len>b.len?a.len:b.len;
    BIGINT ans={{0},len,0};
    int temp,carry=0;
    for(int i=0;i<len;i++)
    {
        temp=a.num[i]+b.num[i]+carry;
        ans.num[i]=temp%10;
        carry=temp/10;
    }
    if(carry)
    {
        ans.num[len]=carry;
        ans.len=len+1;
    }
    return ans;
}
BIGINT sub(BIGINT a,BIGINT b)
{
    BIGINT ans={{0},a.len>b.len?a.len:b.len,0};
    if(a.len<b.len)//确保大数减去小数
    {
        ans=sub(b,a);
        ans.neg=1;
        return ans;
    }
    else if(a.len==b.len)
    {
        for(int i=a.len-1;i>=0;i--)
        {
            if(a.num[i]<b.num[i])
            {
                ans=sub(b,a);
                ans.neg=1;
                return ans;
            }
        }
    }
    int temp,carry=0;
    for(int i=0;i<a.len;i++)
    {
        temp=a.num[i]-b.num[i]-carry;
        carry=temp<0?1:0;
        ans.num[i]=(temp+10)%10;//借位可能产生负数,加10不影响余数
    }
    // for(int i=a.len-1;i>=0;i--)//确定相减结果的位数
    // {
    //     if(ans.num[i]!=0)
    //     {
    //         ans.len=i+1;
    //         return ans;
    //     }
    // }
    // ans.len=1;
    ans.len=a.len>b.len?a.len:b.len;//确定相减的位数,注意初始化ans.len
    while(ans.num[ans.len-1]==0&&ans.len>1)   ans.len--;
    return ans;
}
BIGINT mul(BIGINT a,BIGINT b)
{
    BIGINT c={{0},a.len+b.len,0};//a*b的最大长度位a、b的幂次和
    int temp=0,carry=0;
    for(int i=0;i<a.len;i++)
    {
        for(int j=0;j<b.len;j++)
        {
            temp=a.num[i]*b.num[j]+carry+c.num[i+j];
            c.num[i+j]=temp%10;
            carry=temp/10;
        }
        c.num[i+b.len]=carry;
    }
    c.len=a.len+b.len;
    while(c.num[c.len-1]==0&&c.len>1)   c.len--;
    return c;

}

2022/7/22 09:57
加载中...