0分求救

P1303 A*B Problem

Zeke @ 2021-11-19 11:47:09

//luogu P1303 A*B
#include <iostream>
using namespace std;

short a[3000]={0},b[3000]={0};
short c[5000000];

void swap(short &a,short &b)
{
    short c=a;
    a = b;
    b = c;
}

int main()
{
    char t;

    while(t = getchar())
    {
        if(t == '\n') break;
        a[++a[0]] = t-'0';
    }
    while(t = getchar())
    {
        if(t == '\n') break;
        b[++b[0]] = t-'0';
    }

    for(int i = 1;i <= (1+a[0])/2;i ++) swap(a[i],a[a[0]-i+1]);
    for(int i = 1;i <= (1+b[0])/2;i ++) swap(b[i],b[b[0]-i+1]);

    for(int i = 1;i <= a[0];i ++)
        for(int j = 1;j <= b[0];j ++)
        {
            c[i+j-1] += a[i]*b[j];
            if(i+j-1 > c[0]) c[0]=i+j-1;
        }

    for(int i = 1;i <= c[0];i ++)
    {
        if(c[i]/10)
        {
            c[i+1] += c[i]/10;
            c[i] %= 10;

            if(i == c[0]) c[0] ++;
        }
    }

    for(int i = c[0];i;i --) if(c[i] == 0) {c[0]--;break;}
    for(int i = c[0];i;i --) cout << c[i];cout << endl;

    return 0;
}

连第一个点都没过

测试数据下载了,输入输出都一样?


by Terrible @ 2021-11-19 13:06:02

@Zeke

1.应该是输入的问题,建议重写一下,可能数据中有回车符'\r'。除此之外,出于严谨考虑,我们不能认为文件末尾一定有换行,这个要慎重(虽然题目数据确实末尾有换行,其实输入是3行)。

2.万一short不够用了怎么办?用int


by Terrible @ 2021-11-19 13:07:13

3.还得考虑结果是 0 的情况,至少要有一位输出

for(int i = c[0];i>1;i --) if(c[i] == 0) {c[0]--;break;}


by Terrible @ 2021-11-19 13:15:42

考虑一种极端情况,数据是两个 10^{2000}-1,也就是1999个9

那么 c[1999] 运算过程中需要加起来 9\times 9\times 1999=161919,所以 c[1999] 会超过 32767.


by Zeke @ 2021-11-19 14:04:10

@Terrible 多谢0.0


by Terrible @ 2021-11-19 16:49:13

您可以试试这么读入 @Zeke

char c1[3001],c2[3001];
scanf("%s %s",c1,c2);
for(int i=0;c1[i];i++)a[++a[0]]=c1[i]-'0';
for(int i=0;c2[i];i++)b[++b[0]]=c2[i]-'0';

by Terrible @ 2021-11-19 16:51:23

#include <iostream>
using namespace std;

short a[3000]={0},b[3000]={0};
int c[5000];

void swap(short &a,short &b)
{
    short c=a;
    a = b;
    b = c;
}

int main()
{
    char t;
    char c1[3001],c2[3001];
    scanf("%s %s",c1,c2);
    for(int i=0;c1[i];i++)a[++a[0]]=c1[i]-'0';
    for(int i=0;c2[i];i++)b[++b[0]]=c2[i]-'0';

    for(int i = 1;i <= (1+a[0])/2;i ++) swap(a[i],a[a[0]-i+1]);
    for(int i = 1;i <= (1+b[0])/2;i ++) swap(b[i],b[b[0]-i+1]);

    for(int i = 1;i <= a[0];i ++)
        for(int j = 1;j <= b[0];j ++)
        {
            c[i+j-1] += a[i]*b[j];
            if(i+j-1 > c[0]) c[0]=i+j-1;
        }

    for(int i = 1;i <= c[0];i ++)
    {
        if(c[i]/10)
        {
            c[i+1] += c[i]/10;
            c[i] %= 10;

            if(i == c[0]) c[0] ++;
        }
    }

    while(c[c[0]]==0&&c[0]>1)c[0]--;
    for(int i = c[0];i;i --) cout << c[i];cout << endl;

    return 0;
}

这是我提交的


by Zeke @ 2021-11-19 17:06:40

@Terrible 过了,两种输入好像有所不同,所以第一个点没过。然后我的去掉高位0的方法多了个break;

谢谢啦


|