首页 > 代码库 > hdu 1215 七夕节

hdu 1215 七夕节

 

作为一个新手,最大的优势就是每道题都能学到很多经验,这道题真是让我受益匪浅。

首先给数组初始化时想到用memset,头文件 <memory.h> or <string.h>,可我想都赋值为1,用memset(a,1,sizeof(a))是不行的,memset不能给非字符型数组赋值,不过可以都初始化为0,给字符型数组赋值很方便。详细参考http://baike.baidu.com/view/982208.htm

求全部的约数之和也可用筛法(一般用来求素数)+打表(就是把一定范围里的全部素数都求出来,需要那个就返回哪个)。

大数组要开在主函数外面,否则会超时,而且要比要求的数值再大1、2个。

循环赋值时那个等号不能少,少了就WA,测试数据会取边界值检测,一定注意边界的处理,ACM对细节的处理非常在意。

 1 #include<stdio.h> 2 #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 }