为什么子函数里面清空数组无效?是我哪写错了吗

P1045 [NOIP2003 普及组] 麦森数

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 位的。


| 下一页