时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:9302
解决:3019
- 题目描述:
-
求正整数N(N>1)的质因数的个数。相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
- 输入:
-
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
- 输出:
-
对于每组数据,输出N的质因数的个数。
- 样例输入:
-
120
- 样例输出:
-
5
- 提示:
-
注意:1不是N的质因数;若N为质数,N是N的质因数。
- 来源:
- 2007年清华大学计算机研究生机试真题
#include<iostream> #include<stdio.h> #define Max 100010 using namespace std; bool Mark[Max]; int prime[Max]; int primesize; void Isprime(){ for(int i=0;i<Max;i++){ Mark[i]=false; } primesize=0; for(int i=2;i<Max;i++){ if(!Mark[i]){ //如果是 prime[primesize++]=i; for(int j=i*2;j<Max;j+=i) prime[j]=true; } } } /*int Recycle(int x,int primenum,int count){ //循环除一个数,来判断幂指数 if(x%primenum==0){ count++; Recycle(x/primenum,primenum); } else{ return count; } }*/ //以下代码思路来自参考书 int main(){ int n; Isprime(); while(scanf("%d",&n)!=EOF){ int ansPrime[30]; //按顺序保存分解出来的素数 int ansSize=0; //分解出来素因素的个数 int ansNum[30]; //保存分解出来的素因素对应的幂指数 for(int i=0;i<primesize;i++){ //依次测试每个素数 if(n%prime[i]==0){ // ansPrime[ansSize]=prime[i]; //第ansSize个素数是prime[i] ansNum[ansSize]=0; //第ansSize个素数的幂指数是0,此时相当于初始化; while(n%prime[i]==0){ ansNum[ansSize]++; //幂指数要增加了 n/=prime[i]; //判断该素因数的幂指数最大是多少 } ansSize++; //该素因数判断完了,准备记录下一个素因数 if(n==1) break; } } if(n!=1){ //如果测试完2-100000所有的素数n仍然没有被分解为1,则剩余的因数一定是n,一个大于100000的素因数 ansPrime[ansSize]=n; //记录该素因数,注意此时不用ansSize++因为上面一个for循环中执行了ansSize++ ansNum[ansSize++]=1; //其幂指数只能是1,先执行ansNum[ansSize]再执行ansSize++,必须执行ansSize++ } int ans=0; for(int i=0;i<ansSize;i++){ ans+=ansNum[i]; } printf("%d\n",ans); } return 0; }