yinhan @ 2020-02-14 17:57:46
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int num[1001];
int ans[1001];
int base[1001];
int re[1001];
void multiply(int* a,int* b,int* c)
{
memset(c,0,sizeof(c)); //为什么仅有子函数里面的赋值无效
for(int i=1;i<=500;i++)
{
for(int j=1;j<=500;j++)
{
c[i+j-1]+=a[i]*b[j];
}
}
for(int i=1;i<=500;i++)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
void fastpower(int b,int p)
{
while(p!=0)
{
if(p & 1==1)
{
memset(num,0,sizeof(num));
multiply(ans,base,num);
memcpy(ans,num,sizeof(ans));
}
p=p>>1;
memset(re,0,sizeof(re));
multiply(base,base,re);
memcpy(base,re,sizeof(base));
}
}
int main()
{
int p;
cin>>p;
ans[1]=1;
base[1]=2;
fastpower(2,p);
printf("%d\n",(int)(log10(2)*p+1));
ans[1]--;
for(int i=500;i>=1;i--)
{
if(i!=500 && i%50==0) printf("\n");
printf("%d",ans[i]);
}
return 0;
}
emm就是一开始我觉得子函数里面清空数组后应该就行了,但是答案是错的,比如p为10的时候快速幂某一步16*16算出为266,是因为子函数里面c只清空了c[1]=6,但是c[2]为1并没有清空。。。。求解
by yinhan @ 2020-02-14 18:47:20
@ouuan 谢谢,我大概明白了
by yinhan @ 2020-02-14 18:47:38
@function_of_zero 谢谢啦