题目1087:约数的个数

题意RT

 

就是要注意加了注释的那里- -!

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cmath>
 6 #include<map>
 7 #include<queue>
 8 
 9 using namespace std;
10 
11 typedef long long ll;
12 
13 const int x = 1000000000;
14 bool ispri[32000];
15 int pri[3410];
16 int c;
17 
18 void init()
19 {
20     memset(ispri,0,sizeof(ispri));
21     c = 0;
22     int m = (int)(sqrt(x+0.5)+0.5);
23     for(int i=2;i<=m;i++)
24     {
25         if(!ispri[i])
26         {
27             pri[c++] = i;
28             for(int j=i*2;j<=m;j+=i)
29             {
30                 ispri[j] = true;
31             }
32         }
33     }
34 }
35 
36 void solve(int num)
37 {
38     int ans = 1;
39     for(int i=0;i<c;i++)
40     {
41         if(pri[i]<=num && num%pri[i]==0)
42         {
43             int cnt = 0;
44             while(num>0 && num%pri[i]==0)
45             {
46                 cnt++;
47                 num/=pri[i];
48             }
49             ans*=(1+cnt);
50         }
51     }
52     //如果是大于打的素数表的最大值int(sqrt(x+0.5)+0.5)且小于x的素数
53     if(num!=1) ans*=2;  //!!!
54     printf("%d\n",ans);
55 }
56 
57 int main()
58 {
59     int n,num;
60     init();
61     while(~scanf("%d",&n))
62     {
63         for(int i=0;i<n;i++)
64         {
65             scanf("%d",&num);
66             solve(num);
67         }
68     }
69     return 0;
70 }

 

posted @ 2015-04-03 19:21  fukan  阅读(267)  评论(0编辑  收藏  举报