请问为什么这样不行,只有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;
}
就只是修改了高精度乘法函数中的边界条件而已。愿有大佬赐教。