题目描述:
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1< N< 10^9)。
输出:
对于每组数据,输出N的质因数的个数。
样例输入:
120
样例输出:
5
#include <iostream> #include<cstdio> #include<algorithm> #include<string.h> using namespace std; bool mark[100001];//标记数字是否为素数,如果为true,则为非素数 int prime[100001];//保存筛得的素数 int primesize;//保存素数个数 void init(){ primesize = 0; memset(mark,false,sizeof(mark)); for(int i=2;i<=10000;i++){//遍历所有数字 if(mark[i] == true)//如果已经被标记,则跳过 continue; prime[primesize++] = i;//否则又得到一个新的素数 for(int j=i*i;j<=10000;j += i)//将该数的所有倍数均标记成非素数 mark[j] = true; } } int main() { init(); int n; scanf("%d",&n); int ansPrime[30];//存放被分解出的素因数 memset(ansPrime,0,sizeof(ansPrime)); 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;//初始化幂指数 while(n%prime[i] == 0){//从被测试数中将该素数分解出来,并统计其幂指数 ansNum[ansSize]++; n /= prime[i]; } ansSize++;//素因数个数增加 if(n == 1)//若已经被分解成1,则分解提前终止 break; } } if(n != 1){//剩下了一个比100000还大的素因数 ansPrime[ansSize] = n;//记录该大素因数 ansNum[ansSize++] = 1;//其幂指数只能为1 } int ans = 0; for(int i=0;i<ansSize;i++) ans += ansNum[i];//统计各个素因数的幂指数 printf("%d",ans); return 0; }
总结:
学会遍历筛选素数。这其中有个部分,j=i*i为开始,是因为i*k(k<i)必在求得k的某个素因数的时候就已经被标记过了,所以可以直接从i的平方开始算