题目描述:
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出:
对于每组数据,输出N的质因数的个数。
样例输入:
120
样例输出:
5
提示:
注意:1不是N的质因数;若N为质数,N是N的质因数。
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
bool mark[100001];
int prime[100000];
int size=0;
void init(){
for (int i=2;i<100000;i++)
mark[i]=false;
for (int i=2;i<100000;i++){//输入数据是10^9,这里用100000以下的素数做分解是因为n的大于sqrt(n)的因子只能有一个
if (mark[i])
continue;
prime[size++]=i;
if (i>=1000) continue;//没加这句程序就崩溃了,应该是因为i>1000,那么j就越界了,当输入的数字很大时,一定要注意有没有平方运算会让数字越界
for (int j=i*i;j<100000;j+=i){
mark[j]=true;
}
}
}
int main (){
int n;
int ans[30];
int as;
int anscnt[30];
init();
while (cin>>n){
as=0;
for (int i=0;i<size;i++){
if (n%prime[i] == 0){
ans[as]=prime[i];
anscnt[as]=0;
while(n%prime[i] == 0){
anscnt[as]++;
n /= prime[i];
}
as++;
if (n==1)
break;
}
}
if (n!=1){
ans[as]=n;
anscnt[as++]=1;
}//注意这里,还要判断n是否被分解完全了,n若不是一,那么剩余的因数一定是n,大于100000的素因数
int answerc=0;
for (int i=0;i<as;i++){
answerc+=anscnt[i];
}
cout<<answerc<<endl;
}
return 0;
}