-
题目描述:
-
求正整数N(N>1)的质因数的个数。相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
-
输入:
-
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
-
输出:
-
对于每组数据,输出N的质因数的个数。
-
样例输入:
-
120
-
样例输出:
-
5
-
提示:
-
注意:1不是N的质因数;若N为质数,N是N的质因数。
#include<stdio.h>
#include<string.h>
#define MAX 100001
int primeSize;//统计素数的个数
int prime[MAX];//保存素数
int mark[MAX];//标记是否为素数
void select(){//筛选素数
int i,j;
primeSize=0;//素数个数初始化为0
memset(mark,0,sizeof(mark));//全部初始化标记数组为0
for(i=2;i<MAX;i++){
if(mark[i]) continue;//如果已经被标记为1 则表示为非素数继续循环进行判断
prime[primeSize++]=i;//否则该数是素数,将该数保存至素数数组中
if(i>400) continue;//如果该数大于400,则继续循环判断
for(j=i*i;j<=MAX;j+=i)//将该素数的倍数全部标记为非素数
mark[j]=1;
}
}
int main(){
select();
int N,cnt,i;
while(~scanf("%d",&N)){//输入该数
cnt=0;//统计质因数的个数
for(i=0;i<primeSize;i++){//120
while(N % prime[i]==0) {//如果该数能够整除素数 2 2 2 3 5
cnt++;//则累加质因数//1 2 3 4 5
N/=prime[i];//该数被除数//60 30 15 5 1
}
}
if(N!=1) cnt++;//如果该数最后不是为1,
//则说明该数本身就是素数,进行循环,没有执行前面的for
printf("%d\n",cnt);//输出质因数的个数
}
return 0;
}
当所求的数字小的时候,则可以另一种解法:
代码如下:
#include<stdio.h>
int Count(int x){
int i,ans=0;
for(int i=2;i<=x;i++){
while(x%i==0){//如果x能够整除i
x/=i;//则说明是x的一个质因数,而且质因数可以循环
ans++;//累加
}
}
return ans;//返回统计质因数的个数
}
int main(){
int x;
while(~scanf("%d",&x)){
printf("%d\n",Count(x));
}
return 0;
}