题目描述:
求正整数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年清华大学计算机研究生机试真题]相关推荐

  1. 特殊乘法 [清华大学计算机研究生机试真题]

    题目描述: 写个算法,对2个小于1000000000的输入,求结果. 特殊乘法举例:123 * 45 = 14 +15 +24 +25 +34+35 输入描述: 两个小于1000000000的数 输出 ...

  2. 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 ...

  3. 2006年清华大学计算机研究生机试真题

    http://ac.jobdu.com/problem.php?pid=1078 二叉树遍历 #include<stdio.h> #include<string.h>//二叉树 ...

  4. 2008年清华大学计算机研究生机试真题

    http://ac.jobdu.com/problem.php?pid=1080  进制转换 当然这个题目如果使用大数模板来做的话,也是可以AC的,话说我第一次就是用大数模板AC的,然后又改用了下面这 ...

  5. [高精度整数] N的阶乘 [2006年清华大学计算机研究生机试真题]

    题目描述: 输入一个正整数N,输出N的阶乘. 输入描述: 正整数N(0<=N<=1000) 输出描述: 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘 样例输入: 4 5 15 样 ...

  6. 素数 [2008年北京航空航天大学计算机研究生机试真题]

    题目描述: 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1. 输入描述: 输入有多组数据. 每组一行,输入 ...

  7. 素数判定 [2009年哈尔滨工业大学计算机研究生机试真题]

    题目描述: 给定一个数n,要求判断其是否为素数(0,1,负数都是非素数). 输入描述: 测试数据有多组,每组输入一个数n. 输出描述: 对于每组输入,若是素数则输出yes,否则输入no. 样例输入: ...

  8. 题目1163:素数 2008年北京航空航天大学计算机研究生机试真题

    格式原因,所以先存储,再打印 #include <stdio.h> #include <math.h> bool judge(int n) {int i,j,k;int a[1 ...

  9. 2007年浙江大学计算机及软件工程研究生机试真题

    http://ac.jobdu.com/problem.php?pid=1025  最大报销额 //将题目中数字都扩大100倍变成整数,就可看作经典的01背包问题 //设报销额度为背包上限,可报销支票 ...

最新文章

  1. 通讯录_怎么恢复手机通讯录?最完整手机通讯录恢复方法大公开
  2. Docker selenium自动化 - 修改/dev/shm路径大小实例演示,“session deleted because of page crash“问题解决
  3. iOS游戏开发教程资源
  4. C语言工厂方法模式,工厂函数模式 (C语言实现)
  5. 瑞士加密银行SEBA将发行B轮融资股票作为证券代币
  6. 2d头发_3D打印毛囊突破性进展!“头发工厂”将成秃顶的救星
  7. 我靠ppt做兼职副业,1月还清2W贷款成功上岸!
  8. Diamond书写FPGA代码
  9. 关于EmmyLua插件创建Lua脚本Require失败的问题
  10. 判断常用贴片元器件正负极简述(嵌入式硬件篇)
  11. 前端导航栏的几种写法
  12. 运用regedit编辑器恢复清空回收站之后的文件
  13. 拥有百万粉丝的大牛讲述学Android的历程程。看看你缺了哪些?
  14. 众数问题c语言编程,C语言 众数问题
  15. 12.1 hashlib--安全的哈希计算和签名库
  16. css都能作哪些特效,推荐10款重量级CSS3的全新特效
  17. i春秋新春战疫公益赛复现
  18. 亚信安全:坚持自主可控 做中国本土化专业化的安全公司
  19. 纳什均衡-- 硬币正反
  20. MybatisPlus条件构造器wrapper方法的使用

热门文章

  1. 利用java导入导出excel到oracle数据库
  2. 谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画!
  3. 数据库第二节 sql表格创建及内容插入和查询
  4. 快速校对所有文件的md5值
  5. Python基础【day03】:字典(一)
  6. [转]HttpWatch工具简介及使用技巧
  7. 动态规划思想-----求数组中出现最多数
  8. 我在用的浏览器插件利器
  9. 【Java 泛型】泛型(泛型类型、原始类型、泛型方法)、通配符(上界、下界、无限制、继承)
  10. 算法图解学习笔记02之选择排序