感觉此题数据有些水

P1303 A*B Problem

info___tion @ 2018-06-19 15:12:03

这是一个假的模板(我在做P1009 阶乘之和时发现这个模板有问题)

#include<stdio.h>
#include<string.h>
using namespace std;

const int maxl=4002;

struct node
{
    int len;
    int num[maxl];

    void Read(char *s)
    {
        len=strlen(s);

        for(int i=1;i<=len;i++)
            num[i]=s[len-i]-'0';

        return;
    }

    void Init()
    {
        len=0;
        memset(num,0,sizeof(num));

        return;
    }

    void print()
    {
        if(!len)
        {
            putchar('0');
            return;
        }

        for(int i=len;i>=1;i--)
            putchar(num[i]+'0');

        return;
    }
}A,B; 

void mod(int& x)
{
    x%=10;
    return;
}

node mul(node x,node y)
{
    node ret;
    ret.Init();

    int len=x.len+y.len-1;

    for(int i=1;i<=x.len;i++)
        for(int j=1;j<=y.len;j++)
        {
            int tmp=x.num[i]*y.num[j];
            int pos=i+j-1;

            ret.num[pos]+=tmp;

            int over=ret.num[pos]/10;

            mod(ret.num[pos]);

            ret.num[pos+1]+=over;
        }

    while(!ret.num[len]&&len>1) len--;
    ret.len=len;

    return ret;
}

int main()
{
    char ca[maxl],cb[maxl];
    scanf("%s%s",&ca,&cb);

    A.Read(ca);
    B.Read(cb);

    node ans=mul(A,B);
    ans.print();

    return 0;
}

然而用这个假模板交到这一题上面就AC了?


by info___tion @ 2018-06-19 15:13:40

这个模板才是真的:

#include<stdio.h>
#include<string.h>
using namespace std;

const int maxl=4002;

struct node
{
    int len;
    int num[maxl];

    void Read(char *s)
    {
        len=strlen(s);

        for(int i=1;i<=len;i++)
            num[i]=s[len-i]-'0';

        return;
    }

    void Init()
    {
        len=0;
        memset(num,0,sizeof(num));

        return;
    }

    void print()
    {
        if(!len)
        {
            putchar('0');
            return;
        }

        for(int i=len;i>=1;i--)
            putchar(num[i]+'0');

        return;
    }
}A,B; 

void mod(int& x)
{
    x%=10;
    return;
}

node mul(node x,node y)
{
    node ret;
    ret.Init();

    int len=x.len+y.len;

    for(int i=1;i<=x.len;i++)
        for(int j=1;j<=y.len;j++)
        {
            int tmp=x.num[i]*y.num[j];
            int pos=i+j-1;

            ret.num[pos]+=tmp;

            int over=ret.num[pos]/10;

            mod(ret.num[pos]);

            ret.num[pos+1]+=over;
        }

    while(!ret.num[len]&&len>1) len--;
    ret.len=len;

    return ret;
}

int main()
{
    char ca[maxl],cb[maxl];
    scanf("%s%s",&ca,&cb);

    A.Read(ca);
    B.Read(cb);

    node ans=mul(A,B);
    ans.print();

    return 0;
}

比较一下跟上面的有什么不同


|