作为一个新手,最大的优势就是每道题都能学到很多经验,这道题真是让我受益匪浅。
首先给数组初始化时想到用memset,头文件 <memory.h> or <string.h>,可我想都赋值为1,用memset(a,1,sizeof(a))是不行的,memset不能给非字符型数组赋值,不过可以都初始化为0,给字符型数组赋值很方便。详细参考
求全部的约数之和也可用筛法(一般用来求素数)+打表(就是把一定范围里的全部素数都求出来,需要那个就返回哪个)。
大数组要开在主函数外面,否则会超时,而且要比要求的数值再大1、2个。
循环赋值时那个等号不能少,少了就WA,测试数据会取边界值检测,一定注意边界的处理,ACM对细节的处理非常在意。
1 #include2 #define MAX 500000 3 int a[MAX+1]; //大数组要开在外面,否则超时,而且要比要求的数值再大1、2个 4 int main() 5 { 6 int n; 7 int i,j; 8 scanf("%d",&n); 9 a[0]=0;10 for(i=1;i<=MAX;i++) //这个等号不能少,少了就WA了... 11 a[i]=1; //至少都有1 12 for(i=2;i<=MAX/2+1;i++) 13 for(j=i+i;j<=MAX;j+=i) //只要是i的倍数的数肯定含有i这个因子,i自身就不加了,从i的下个开始14 a[j]+=i;15 while(n--)16 {17 int t;18 scanf("%d",&t);19 printf("%d\n",a[t]); 20 }21 }