质因数的个数(王道)

题目描述:

求正整数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的平方开始算

 
posted @ 2018-03-15 10:53  Shaw_喆宇  阅读(506)  评论(0编辑  收藏  举报