范围问题

P1045 [NOIP2003 普及组] 麦森数

2020许弘毅 @ 2024-03-24 21:08:05

请问为什么这样不行,只有90pts

#include<cmath>
#include<cstdio>
int p,w;
long long a[510],b[510];
void cheng(long long *a,long long *b)//高精乘 
{
    long long c[10010]={0},len=a[0]+b[0];
    if(len>500)
        len=500;
    for(int i=1;i<=a[0];i++)
    {
        for(int j=1;j<=b[0];j++)
        {
            int t=i+j-1;
            c[t]+=a[i]*b[j];
            c[t+1]+=c[t]/10;
            c[t]%=10;
        }
    }
    while(!c[len])
        len--;
    for(int i=1;i<=len;i++)
        a[i]=c[i];
    a[0]=len;
}
int main()
{
    scanf("%d",&p);
    w=ceil(p*log10(2));
    printf("%d\n",w);
    a[0]=b[0]=1; 
    a[1]=1,b[1]=2;
    while(p)//快速幂 
    {
        if(p%2)
            cheng(a,b);
        p>>=1;
        cheng(b,b);
    }
    int d=500;
    a[1]--;
    for(int i=1;i<=10;i++)
    {
        for(int j=1;j<=50;j++)
            printf("%d",a[d--]);
        printf("\n");
    }
    return 0;
}

而改成这样就行了?

#include<cmath>
#include<cstdio>
int p,w;
long long a[510],b[510];
void cheng(long long *a,long long *b)//高精乘 
{
    long long c[10010]={0};
    for(int i=1;i<=500;i++)
    {
        for(int j=1;j<=500;j++)
        {
            int t=i+j-1;
            c[t]+=a[i]*b[j];
            c[t+1]+=c[t]/10;
            c[t]%=10;
        }
    }
    for(int i=1;i<=500;i++)
        a[i]=c[i];
}
int main()
{
    scanf("%d",&p);
    w=ceil(p*log10(2));
    printf("%d\n",w);
    a[0]=b[0]=1; 
    a[1]=1,b[1]=2;
    while(p)//快速幂 
    {
        if(p%2)
            cheng(a,b);
        p>>=1;
        cheng(b,b);
    }
    int d=500;
    a[1]--;
    for(int i=1;i<=10;i++)
    {
        for(int j=1;j<=50;j++)
            printf("%d",a[d--]);
        printf("\n");
    }
    return 0;
}

就只是修改了高精度乘法函数中的边界条件而已。愿有大佬赐教。


|