蒟蒻C++,20分求助

P1303 A*B Problem

LEle0309 @ 2023-03-08 22:03:01

蒟蒻自学高精度,代码如下:

#include<iostream>
#include<cstring>
using namespace std; 
int i,a[2011],b[2011],c[4023],l1,l2,l3,j;
char k[2011],h[2011];
int main()
{
    cin>>k>>h;
    l1=strlen(k);
    l2=strlen(h);
    for(i=1;i<=l1;i++)a[i]=k[l1-i]-'0';
    for(i=1;i<=l2;i++)b[i]=h[l2-i]-'0';
    l3=l1+l2;
    for(i=1;i<=l1;i++)
        for(j=1;j<=l2;j++)
            c[i+j-1]=a[i]*b[j];
    l3=l2+l1;
    for(i=1;i<=l3;i++)
        if(c[i]>=10)
        {
            c[i+1]+=c[i]/10;
            c[i]%=10;
        }
    while(c[l3]==0&&l3>1)l3--;
    for(i=l3;i>=1;i--)cout<<c[i];
    return 0;
}

Here is the record,这里是记录


by tangguo_yyds @ 2023-03-08 22:09:32

@LEle0309

代码的差异似大非大

#include<iostream>
#include<cstring>
using namespace std; 
int i,a[2011],b[2011],c[4023],l1,l2,l3,j;
char k[2011],h[2011];
int main()
{
    cin>>k>>h;
    l1=strlen(k);
    l2=strlen(h);
    for(i=1;i<=l1;i++)a[i]=k[l1-i]-'0';
    for(i=1;i<=l2;i++)b[i]=h[l2-i]-'0';
    l3=l1+l2;
    for(int i=1;i<=l2;i++){
        for(int j=1;j<=l1;j++){
            c[i+j-1]+=b[i]*a[j];
            c[i+j]+=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
    }
    while(c[l3]==0&&l3>1)l3--;
    for(i=l3;i>=1;i--)cout<<c[i];
    return 0;
}

by LEle0309 @ 2023-03-08 22:33:46

@tangguo_yyds

54最后统一进位滴……


by LEle0309 @ 2023-03-10 21:37:22

@tangguo_yyds

已AC,谢谢

顺便问个问题 我之前那个最后统一进位为啥20分?


by tangguo_yyds @ 2023-03-10 23:53:47

@LEle0309 统一进位的代码好像得这样写

#include<iostream>
#include<cstring>
using namespace std; 
int i,a[2011],b[2011],c[4023],l1,l2,l3,j;
char k[2011],h[2011];
int main()
{
    cin>>k>>h;
    if(k[0]=='0'||h[0]=='0'){
        cout<<"0";
        return 0;
    }
    l1=strlen(k);
    l2=strlen(h);
    for(i=1;i<=l1;i++)a[i]=k[l1-i]-'0';
    for(i=1;i<=l2;i++)b[i]=h[l2-i]-'0';
    for(i=1;i<=l1;i++)
        for(j=1;j<=l2;j++)
            c[i+j]+=a[i]*b[j];
    for(i=1;i<=4000;i++){//数据范围的2倍
        c[i+1]+=c[i]/10;
        c[i]%=10;
         l3=i;
    }
    while(c[l3]==0&&l3>1)l3--;
    for(i=l3;i>1;i--)cout<<c[i];
    return 0;
}

by tangguo_yyds @ 2023-03-10 23:56:09

@LEle0309

20分你对的只是第一个数据

输入

0
10

输出

0

这个测试当然是不用进位的,所以能过,其他因为进位的问题,结果基本都是错的,还是推荐你边加边进位


by LEle0309 @ 2023-03-11 13:42:12

@tangguo_yyds

谢谢~

Thanks♪(・ω・)


|