习题10-9 UVA 294 Divisors(约数)
2016-02-03 19:47
295 查看
看到这个题,一看U-L <= 10000感觉数据量好小啊,就果断尝试做做。
让你找一个数的正因子个数,感觉应该不是硬来的,就百度了一下,果然有比较简单的方法:
找一个数X的约数个数:
根据唯一分解定理:可以把整数X分解成若干素数相乘的形式:X = (P1^a1 )× (P2^a2 )× (P3^a3 )......
那么X的正因子个数就等于 (a1+1) × (a2+1) × (a3+1)......
所以思路就很清晰了:
1.先从L到H遍历 才1W,
2.然后对遍历的每一个数进行找素数,可以放到map里面,
3.最后遍历map即可!
注意:
遍历素数时,一定是 <= sqrt 而不是 < 因为这错了1次。。
代码如下:
让你找一个数的正因子个数,感觉应该不是硬来的,就百度了一下,果然有比较简单的方法:
找一个数X的约数个数:
根据唯一分解定理:可以把整数X分解成若干素数相乘的形式:X = (P1^a1 )× (P2^a2 )× (P3^a3 )......
那么X的正因子个数就等于 (a1+1) × (a2+1) × (a3+1)......
所以思路就很清晰了:
1.先从L到H遍历 才1W,
2.然后对遍历的每一个数进行找素数,可以放到map里面,
3.最后遍历map即可!
注意:
遍历素数时,一定是 <= sqrt 而不是 < 因为这错了1次。。
代码如下:
#include<map> #include<cstdio> #include<cmath> using namespace std; int main() { int n,L,H; scanf("%d",&n); while(n--){ scanf("%d%d",&L,&H); int sum = -1,key; for (int i = L; i <= H; ++i){ map<int,int>m; if (i == 1){if (1 > sum){sum = 1;key = i;}continue;} int temp = 1,ii = i; for (int k = 2; k <= sqrt(ii); ++k){ if (ii % k == 0){ if (!m.count(k))m[k]=0; m[k]++; ii/=k; k = 1; } } if (ii != 1 && !m.count(ii))m[ii]=0;m[ii]++; for (map<int,int>::iterator it = m.begin() ;it != m.end(); ++it)temp *= (it->second + 1); if (temp > sum){sum = temp;key=i;} } printf("Between %d and %d, %d has a maximum of %d divisors.\n",L,H,key,sum); } return 0; }
相关文章推荐
- Hadoop 之 Combiner 与自定义 Combiner
- 华为oj字符串合并处理
- sublime text3 配置插件包记录
- 深入理解java垃圾回收机制
- 递归汉诺塔
- 读 大数据 有感
- android 单元测试简单方法及错误处理
- 1049. 数列的片段和(20)
- 1050. 螺旋矩阵(25)
- 【React Native开发】React Native控件之Touchable*系列组件详解(18)
- 1048. 数字加密(20)
- HDU 3711 Binary Number
- POJ3264 Balanced Lineup(线段树)
- 百度
- PHPSTORM ACTIVATION 注册激活
- JQuery实现品牌展示
- MySQL and SQL Injection
- [Lintcode] Remove Linked List Elements 删除链表中的元素
- 设计模式——原则
- 初学Java Web,搭建开发环境(Eclipse+Tomcat+MySQL)