求最大质因数

准备跟着公众号“数据结构和算法”刷题,希望能坚持下去
2020.11.23
1,最大质因数
13195的所有质因数为5、7、13和29。600851475143最大的质因数是多少?

分析:这个问题可以看成是分解质因数,我们小学学的分解质因数用的短除法,假设求n的最大质因数
先把n除以2,如果能除尽,说明2是n的一个质因数,那么我们会得到另一个因数n/2,但是不知道n/2是质数还是合数,所以需要对n/2继续用短除法。.
如果n除以2不能除尽(n%2!=0),那么我们需要继续除以3,,,,,,,,,4,,,,,n-1;
我们每次短除都会得到一个比最大质因数小的质因数,所以最后的结果就是最大质因数
考虑n=1的情况,因为1不是质数也不是合数,直接返回1
在这里插入图片描述短除法是分解因式的重要方法:把一个数进行短除可以分解成若干个质数相乘,分解质因数要从最小的质数2开始除,直到没有因数2再除以下一个质数……直至除得的商也是质数为止(此刻的商就是最大质因数)

解决方法
①递归
求一个数的最大质因数

long long findMaxPrimer(long long  n)
{
	if (n == 1)
		//先判断输入的数是不是1,如果是1则原样输出,因为1不是质数		
		return 1;
	else
	{ 
		for (int i = 2; i < n; i++)//
		{
			if (n%i == 0)
				return findMaxPrimer(n / i);//对每一个短除后的因数再进行短除
		}	
	return n;//这是当最后得到的比如23时,findMaxPrimer(23) 一直不会进for循环里面的if语句,那么for执行完毕,返回23;
	//else 里面也必须有返回值
	}
}

②普通for循环

long long  findMaxPrimer2(long long  n)
{
	if (n == 1)
		return 1;
	else
	{	
		for (int i = 2; i < n; i++)//注意,当n=2,for循环不会执行,因为i<n不成立,直接返回n=2
		{
			if (n%i == 0)
			{
				n = n / i;
			}
		}
		return n;
	}
}

在这里插入图片描述
求最大质因数

大家看这段代码可能会出现疑惑i会不会加到大于n,其实不会。i是从2开始加的,每一次n%i=0的时候,说明i是n的一个因数,n=n/i,i最多加到i=n,然后n=n/i=1,while循环结束

int GetMaxPrime(int n) {
	int i = 2;
	int res = 1;
	while (n > 2) {
		if (n%i == 0) {
			n /= i;
			res = i;
		}	
		else
			i++;
	}
	return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值