求质因数问题
2015-07-21 00:16
375 查看
一、求一个数的所有质因数(尤其n很大时)
我刚开始想的是观察题目给的数据范围,预处理出能够满足这个范围的所有素数,也就是2~sqrt(n)范围内的素数,然后根据输入的n一次遍历这些素数,判断是否整除,但是有一个bug是这种方法只能求出sqrt(n)以内的质因数。所以这个方法不可行。
可行方案:
二、求多个数的质因数(n不是很大)
在素数筛的时候加了一个vector数组就实现了。
这里其实就用到了我上面的想法,不过正如你所看到的这种方法只能求n不大的。
我刚开始想的是观察题目给的数据范围,预处理出能够满足这个范围的所有素数,也就是2~sqrt(n)范围内的素数,然后根据输入的n一次遍历这些素数,判断是否整除,但是有一个bug是这种方法只能求出sqrt(n)以内的质因数。所以这个方法不可行。
可行方案:
long long a[],n,cnt=0; for(int i=2;i*i<=n;i++){ if(n%i==0){ a[cnt++]=i; while(n%i==0) n/=i; } } if(n>1) a[cnt++]=n;
二、求多个数的质因数(n不是很大)
在素数筛的时候加了一个vector数组就实现了。
这里其实就用到了我上面的想法,不过正如你所看到的这种方法只能求n不大的。
int vis[100010];//测试了一下,10^6的时候就很慢了,所以用来做最多10^5的数 vector<int>a[100010]; memset(vis,0,sizeof(vis)); for(int i=0;i<100010;i++) a[i].clear(); for(int i=2;i<100010;i++){ if(!vis[i]){ vis[i]=1; a[i].push_back(i); for(int j=2;j*i<100010;j++){ vis[j*i]=1; a[j*i].push_back(i); } } }
相关文章推荐
- 整理好的git命令(没细分,见谅)
- Ubuntu安装后,无启动项,解决办法
- 如何使用Word2007发布csdn博文
- [Leetcode 61, Medium] Rotate List
- poj3268 最短路
- 理解微软100题
- 【树形dp】hdu 2412 Party at Hali-Bula
- Day03-JavaScript高级编程
- 黑马程序员————Java基础日常笔记---IO流二
- ——JAVASE-GUI图形用户界面
- eclipse集成tomcat日志文件输入配置
- TCP协议与UDP协议的区别
- LightOJ1265 - Island of Survival
- Day02-CSS+Javascript基础
- ZOJ Treasure Hunt IV
- Android扫描SDcard文件
- Python的高级特性7:闭包和装饰器
- LINQ基本字句介绍
- mysql中文查询乱码解决
- Day01-HTML基础