题目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 }

 

转载于:https://www.cnblogs.com/hadis-yuki/p/4390881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值