今天我给大家分享一道非常不错的题:求解质因数的个数
题目描述:
求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
可能有多组测试数据,每组测试数据的输入时一个正整数N,(1<N<10^9)
输出描述:
对于每组数据,输出N的质因数的个数。
示例:
输入:120
输出:5
求解思路1:对于每个输入的数据通过寻找可以整除的质数进行相关运算(如若可以一直整除则一直循环,并且个数加一),直到整除结果为1或者循环至N结束。(该种方法类似于蛮力法,时间复杂度达到O(n^3))
//解法一:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int Next_Prime(int n){
int i,j;
for(i = n;;i ++){
for(j = 2;j < i;j ++){
if(i%j == 0)
break;
}
if(j == i)
return i;
}
return 1;
}
int Caculate_num(int n){
int count = 0;
for(int i = 2;i < n || n != 1;){
if(n%i == 0){
n /= i;
count ++;
}else{
i = Next_Prime(i+1);
}
}
return count;
}
int main(){
int N;
while(scanf("%d",&N) != EOF){
int count = 0;
count = Caculate_num(N);
printf("%d\n",count);
}
return 0;
}
求解思路2:因为任何一个合数都能被一个比它小的质数整除。所以当我们用小质数去分解这个给定的数时,我们已经把他的合数因子分解了。或者从反面去说,如果出现了一个合数a能整除这个数M,那显然在i = a之前应该有一个质数p < a能把a整除,而之前反复地用M去除以p直到p不能再整除M程序才往下执行,那怎么会后来又出现了M中一个合数因子a能被p整除呢?这显然矛盾了。从而可以推出,程序中能整除M的数都是质数。(该种方法时间复杂度只有O(n^1.5))
/*解法二*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int Caculate_num(int n){
int count = 0;
for(int i = 2;i < sqrt(n);i++){
while(n%i == 0){
n /= i;
count ++;
}
if(n <= 1)
break;
}
if(n > 1)
count ++;
printf("%d\n",count);
return 0;
}
int main(){
int N;
while(scanf("%d",&N) != EOF){
Caculate_num(N);
}
return 0;
}