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
",a[t]);    
20     }
21 }
原文地址:https://www.cnblogs.com/xurenwen/p/3868704.html