质因数的个数

   今天我给大家分享一道非常不错的题:求解质因数的个数

题目描述:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值