[素数拓展] 质因数的个数 [2007年清华大学计算机研究生机试真题]
题目描述:
求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=22235,共有5个质因数。
输入描述:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出描述:
对于每组数据,输出N的质因数的个数。
样例输入:
120
样例输出:
5
解题思路: 输入值的取值规模是10910^9109, 筛得的素数数目只需10510^5105,这样处理的理论依据是:n至多有一个大于sqrt(n)的素因数(否则两个大于sqrt(n)的数相乘大于n)。且若1~10000内的素数都不是某输入值的素因数,那么该数的质因数一定等于其本身,且幂指数为1。
代码流程:
1.利用素数筛法得0到100000内的所有素数
2.输入n
3.依次测试步骤1中得到的素数能否整除n,若能则表明该素数为它的一个素因数。
4.不断将n除以该素数,直到不能再被整除为止,同时统计其幂指数。
5.若在完成某个素数的幂指数统计后,n为1,则表明n的所有素因数全部被分解出来。
6.若遍历、测试、分解完所有的预处理出来的素数,n仍然没有被除成1,则表明n存在一个大于100000的因子,且该因子必为其素因数,且其幂指数必为1。
7.最后,将所有素因数的幂指数相加,即得到素因数的个数。
#include<bits/stdc++.h>
using namespace std; bool mark[100001];//mark[x]为true,则表示该数x已被标记为非素数
int prime[100000];//保存筛得的素数
int primeSize;//保存已得到的素数个数 void init(){//素数筛法 for(int i=0; i<=100000; i++)mark[i] = false;//初始化,所有数字均标记为素数primeSize = 0;//得到的素数个数初始为0 for(int i=2; i<=100000; i++){//依次遍历2到10000所有数字 if(mark[i]==true) continue;//若该数字已经被标记为非素数,则跳过 prime[primeSize++] = i;//否则,记录该素数 if(i>=1000) continue;//大于1000的不需要再进行标记,因为i在1000以内已经将100000以内的非素数都标记完了 for(int j=i*i; j<=1000; j+=i){//将该素数的所有倍数标记为 mark[j] = true;}}
} int main(){init();int n;while(scanf("%d", &n)!=EOF){int ansPrime[50]; //按顺序保存分解出的素因数int ansSize = 0; //分解出素因数的个数int ansNum[30]; //保存分解出的素因数对应的幂指数for(int i=0; i<primeSize; i++){//依次测试每一个素数 if(n%prime[i]==0){//若该素数能整除被分解的数 ansPrime[ansSize] = prime[i];//则该素数为其素因数ansNum[ansSize] = 0; //初始化幂指数为0while(n%prime[i]==0){ansNum[ansSize]++;n /= prime[i];}ansSize++; //素因数数量增加if(n==1) break; //若已被分解成1,则分解终止 } } if(n!=1){//若测试完2到100000内所有的素因数,n仍然没有被分解为1,则剩余的因数一定是一个大于100000的素因数 ansPrime[ansSize] = n; //记录该数ansNum[ansSize++] = 1;//其幂指数只能为1 } int ans = 0;for(int i=0; i<ansSize; i++)ans += ansNum[i]; //统计各个素因数的幂指数cout << ans << endl;//输出 }return 0;
}
本题在线测试入口
结束
[素数拓展] 质因数的个数 [2007年清华大学计算机研究生机试真题]相关推荐
- 特殊乘法 [清华大学计算机研究生机试真题]
题目描述: 写个算法,对2个小于1000000000的输入,求结果. 特殊乘法举例:123 * 45 = 14 +15 +24 +25 +34+35 输入描述: 两个小于1000000000的数 输出 ...
- 2010年清华大学计算机研究生机试真题
http://ac.jobdu.com/problem.php?pid=1085 求root(N, k) /* N =a0+a1*k+a2*k^2+......ar*k^r; N'=a0+a1 +a ...
- 2006年清华大学计算机研究生机试真题
http://ac.jobdu.com/problem.php?pid=1078 二叉树遍历 #include<stdio.h> #include<string.h>//二叉树 ...
- 2008年清华大学计算机研究生机试真题
http://ac.jobdu.com/problem.php?pid=1080 进制转换 当然这个题目如果使用大数模板来做的话,也是可以AC的,话说我第一次就是用大数模板AC的,然后又改用了下面这 ...
- [高精度整数] N的阶乘 [2006年清华大学计算机研究生机试真题]
题目描述: 输入一个正整数N,输出N的阶乘. 输入描述: 正整数N(0<=N<=1000) 输出描述: 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘 样例输入: 4 5 15 样 ...
- 素数 [2008年北京航空航天大学计算机研究生机试真题]
题目描述: 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1. 输入描述: 输入有多组数据. 每组一行,输入 ...
- 素数判定 [2009年哈尔滨工业大学计算机研究生机试真题]
题目描述: 给定一个数n,要求判断其是否为素数(0,1,负数都是非素数). 输入描述: 测试数据有多组,每组输入一个数n. 输出描述: 对于每组输入,若是素数则输出yes,否则输入no. 样例输入: ...
- 题目1163:素数 2008年北京航空航天大学计算机研究生机试真题
格式原因,所以先存储,再打印 #include <stdio.h> #include <math.h> bool judge(int n) {int i,j,k;int a[1 ...
- 2007年浙江大学计算机及软件工程研究生机试真题
http://ac.jobdu.com/problem.php?pid=1025 最大报销额 //将题目中数字都扩大100倍变成整数,就可看作经典的01背包问题 //设报销额度为背包上限,可报销支票 ...
最新文章
- 通讯录_怎么恢复手机通讯录?最完整手机通讯录恢复方法大公开
- Docker selenium自动化 - 修改/dev/shm路径大小实例演示,“session deleted because of page crash“问题解决
- iOS游戏开发教程资源
- C语言工厂方法模式,工厂函数模式 (C语言实现)
- 瑞士加密银行SEBA将发行B轮融资股票作为证券代币
- 2d头发_3D打印毛囊突破性进展!“头发工厂”将成秃顶的救星
- 我靠ppt做兼职副业,1月还清2W贷款成功上岸!
- Diamond书写FPGA代码
- 关于EmmyLua插件创建Lua脚本Require失败的问题
- 判断常用贴片元器件正负极简述(嵌入式硬件篇)
- 前端导航栏的几种写法
- 运用regedit编辑器恢复清空回收站之后的文件
- 拥有百万粉丝的大牛讲述学Android的历程程。看看你缺了哪些?
- 众数问题c语言编程,C语言 众数问题
- 12.1 hashlib--安全的哈希计算和签名库
- css都能作哪些特效,推荐10款重量级CSS3的全新特效
- i春秋新春战疫公益赛复现
- 亚信安全:坚持自主可控 做中国本土化专业化的安全公司
- 纳什均衡-- 硬币正反
- MybatisPlus条件构造器wrapper方法的使用