九度-1087 约数的个数[数论]
来源:互联网 发布:网络钢琴 编辑:程序博客网 时间:2024/06/05 07:56
题目来源:2011年清华大学计算机研究生机试真题
- 题目描述:
- 输入n个整数,依次输出每个数的约数的个数
- 输入:
- 输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
- 输出:
- 可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
- 样例输入:
51 3 4 6 12
- 样例输出:
12346
此题解法比较多。
1) 可以直接暴力求解,用类似找素数的方法。循环到 sqrt(n) 逐个判断.
01
#include <iostream>
02
#include <cmath>
03
04
using
namespace
std;
05
06
int
main(
void
)
07
{
08
int
n;
09
while
(cin >> n)
10
{
11
int
num;
12
while
(n--)
13
{
14
int
count = 0;
15
cin >> num;
16
17
int
i;
18
for
(i = 1; i <
sqrt
((
double
)num); i++)
19
{
20
if
(num % i == 0)
21
{
22
count += 2;
23
}
24
}
25
if
(i * i == num)
26
{
27
count++;
28
}
29
cout << count << endl;
30
}
31
}
32
return
0;
33
}
2) 用约数个数定理。百科:http://baike.baidu.com/view/1780622.htm
用约数个数定理做的,只贴出功能函数,主函数里面调用该函数即可。
01
unsigned
int
factors(unsigned
int
n)
02
{
03
unsigned
int
i = 2, k = 0, m = n, count = 1;
04
while
(m != 1)
05
{
06
for
(; i <= m; i ++)
07
if
(m % i == 0)
08
{
09
k = 1;
10
while
(m % i == 0)
11
{
12
k ++;
13
m /= i;
14
}
15
count *= k;
16
}
17
}
18
return
count;
19
}
不用进行素数判定,for循环找到的 i 一定是素数。
自认为该算法应该算比较简洁明了的。
经验证,平均性能比穷举法(O(n))的速度快很多,10^12左右的合数都能瞬间出结果,穷举法要好几秒(不过对于素数,该算法就退化为穷举法了,也就是说最坏情况下时间复杂度为O(n))。
0 0
- 九度-1087 约数的个数[数论]
- 九度OJ 1087 约数的个数
- 九度题目1087:约数的个数
- 九度OJ 1087 约数的个数
- 九度OJ 1087:约数的个数
- 九度题目1087约数的个数
- 九度OJ-1087:约数的个数
- 九度OJ-1087-约数的个数
- 九度题目1087:约数的个数
- 九度OJ 1087:约数的个数
- 九度 题目1087:约数的个数
- 九度OJ 1087 约数的个数 JAVA
- 九度OJ—题目1087:约数的个数
- 九度oj 题目1087:约数的个数
- 九度OJ 题目1087:约数的个数
- 九度OJ 1087:约数的个数 (数字特性)
- 九度 oj 题目1087:约数的个数
- 【九度OJ】题目1087:约数的个数 解题报告
- Jmockit对接口与基类的mock
- [C++ 面试基础知识总结]字符串,向量和数组
- python版opencv入门
- 从sal_listen_port()研究linphone
- bzoj 1055
- 九度-1087 约数的个数[数论]
- ofbiz架构的分布式改造(一)
- eclipse maven创建web project
- 【Android数据传递】Intent传递List和Object和List<Object>(附源码)(转)
- 安卓滑动冲突的理解和一些解决思路
- Java和Android中的注解
- 关于友盟IM自定义表情包的使用
- 路径中/斜杠与\反斜杠的定义
- ofbiz架构的分布式改造(二)