x=p1^e1 * p2^e2 * p2^e2…………
即将x分解为素数p1、p2、p3……等
题目1207:质因数的个数
时间限制:1 秒内存限制:32 兆特殊判题:否提交:9905解决:3206
题目描述:
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1
#include <iostream>
#include<string.h>
#define N 100001
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
bool mark[N];
int prime[N];
int length=0;
void findPrime(){
//素数筛选
//1.初始化所有数字都没有被标记
for(int i=0;i<N;i++){
mark[i]=false;
}
//2.开始筛选
for(int i=2;i<N;i++){
if(mark[i] == true){
continue; //该数已经标记了
}
mark[i]=true; //否则就标记该数
prime[length++]=i;
if(i>=1000) continue; //素数不用超过100000
//cout<<i<<endl;
for(int j=i*i;j>0 && j<N;j+=i){ //标记i的倍数
mark[j]=true;
}
}
}
int main(int argc, char *argv[]) {
//1.筛选出素数
findPrime();
//2.分解素因数
int n;
while(cin>>n){
int ansPrime[30]; //分解出的素数
int ansSize=0; //分解出的素数种类的个数
int ansPower[30]; //每一个分解出的素数的幂次数
memset(ansPower,0,30);
for(int i=0;i<length;i++){
if(n%prime[i] == 0){
ansPrime[ansSize]=prime[i];
while( n%prime[i] == 0){
n/=prime[i];
ansPower[ansSize]++;
}
ansSize++;
if(n == 1){ //若已经被分解为1,则结束分解
break;
}
}
}
if(n!=1){
//测试完1-100000之间所有的素数之后n!=1说明n包含大于100000之间素数的素数。
//由于n<10^9,所以这样的素数只可能有一个
ansPrime[ansSize] = n;
ansPower[ansSize]++;
ansSize++;
}
int ans=0;
for(int i=0;i<ansSize;i++){
ans+=ansPower[i];
}
cout<<ans<<endl;
}
return 0;
}
代码分析:
在素数筛选时,if(i>=1000) continue; //素数不用超过100000
当i查过1000时,其倍数不需要继续进行尝试标记,因为素数的范围为100000。
当试除完所有的1-100000之间的素数后,n!=1.说明n存在一个素数大于1-100000之间的素数,又由于n的质因子不会大于sqrt(n)。所以这样的质因子只可能有一个,所以最后进行单独的处理。