您的位置:首页 > 其它

分解素因数 1

2016-02-04 12:34 399 查看
/*

分解素因数

题目1207:质因数的个数

题目描述:

求正整数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>

#define max 100000

int prime[max+1];

bool mark[max+1];

int primesize;

void init(){
int i,j;
primesize=0;
for(i=1;i<max;i++)
mark[i]=false;
for(i=2;i<=max;i++){
if(mark[i]==true) continue;
prime[primesize++]=i;
if(i>=1000)continue;
for(j=2*i;j<=max;j +=i){
mark[j]=true;
}
}

}

int main(){
init();
int n,i;
while(scanf("%d",&n) != EOF){
int ansprime[30];//分解的素因数
int anssize=0;//分解的素因数个数
int ansnum[30];//分解的素因数的幂指数
for(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) break;
}
}
if(n != 1){//如果测试完2到max的所有素因数,n!=1,则剩余一个大于max的素因数
ansprime[anssize]=n;
ansnum[anssize++]=1;
}
int ans = 0;
for(i=0;i<anssize;i++){
ans += ansnum[i];//统计各个素因数的幂指数
}
printf("%d\n",ans);
}
return 0;
}

//在本题中素数只需筛选到100000,不用到10^9,这是因为

//n至多只存在一个大于sqrt(n)的素因数,否则两个大于

//sqrt(n)的数相乘大于n

//如果要确定被分解整数因数的个数,只需求出所有指数的

//不同组合,(e1+1)*(e2+1)*...*(en+1)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: