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 FZzzz @ 2020-02-14 18:07:46
@yinhan 将数组的开头作为函数的指针参数会导致数组出现降级
by ouuan @ 2020-02-14 18:12:44
@function_of_zero 具体来说是 int[1001]
隐性转换为 int*
了。你说“降级”只有你自己懂吧..
@yinhan c
的类型是 int*
而非 int[1001]
,可以用 sizeof(num)
/sizeof(int[1001])
/sizeof(int) * 1001
来代替 sizeof(c)
。
另外,如果用 vector 就没这么多事了(
by ouuan @ 2020-02-14 18:14:25
vector
使用得当并不会明显比数组慢,我已经 3 个月没怎么用过数组了(
by FZzzz @ 2020-02-14 18:16:02
@ouuan 我学语言的时候不知道从哪看到“从数组到指针的隐形转化称为降级这种说法”,不知道是不是正式的……
顺便orz ouuan
by 1saunoya @ 2020-02-14 18:18:35
orz ouuan
by cmll02 @ 2020-02-14 18:20:05
orz 如果我没记错@ouuan 是B站某lemon改编版发布者???
by ouuan @ 2020-02-14 18:23:10
(果然橙名老年选手只能被人记住 b 站账号了)
by 开始新的记忆 @ 2020-02-14 18:26:02
% ouuan
by yinhan @ 2020-02-14 18:29:51
@ouuan 但是为什么会清空c[1],而不是只清空c[0]呢?
by ouuan @ 2020-02-14 18:30:47
@yinhan 因为 64 位机子上指针是 64 位的。