递归求最大素因数(java)

举报
bigsai 发表于 2021/02/03 03:00:13 2021/02/03
【摘要】 前言 可能经常进群会问这个群号的最大素因数是多少,或者算法题中也会遇到。今天就写一下求最大质因数的模板。 分析 首先分析,怎么求一个数的最大素因数。首先,我们以前求过最大因数,求最大因数的最暴力为2—n-1暴力查找 ,但是这样太超时了,后来发现在根号n前或者后某个区域查找就行了。因为找某个因数时候。n=a* b;a<=根号n;b>=根号n;...

前言

可能经常进群会问这个群号的最大素因数是多少,或者算法题中也会遇到。今天就写一下求最大质因数的模板。

分析

  • 首先分析,怎么求一个数的最大素因数。首先,我们以前求过最大因数,求最大因数的最暴力为2—n-1暴力查找 ,但是这样太超时了,后来发现在根号n前或者后某个区域查找就行了。因为找某个因数时候。n=a* b;a<=根号n;b>=根号n;所以只需查找到最小的因数就可以通过除法找到最大的因数。这只是查找因数的一个思路。

  • 至于什么是素因数呢。那么这个数肯定满足两个条件:1为质数。2为n的因数。那么我们如何从众多n的因数中找到最大的那个素因数呢?

举个例子

  • 对于8=2 * 4=2*(2*2);那么8的最大素因数是2;
  • 对于20=2 * 10=2*(2*5)那么20的最大素因数是5;

可以发现这个查找就是一个递归的过程。对于某个n,查找的最大素因数就是他的最大因数和最小因数的两个数的最大质因数。在往下调用的过程中,如果某个数是质数那么就不进行往下递归,(当然也可以进行剪枝优化,比如设置一个参数为已经找到素因数的最大值,当数值小于这个数就不进行递归减小程序的运算量,但是一般主要的循环到根号n不会超时)
下面附上代码:

private static int getmax(int a) {
	for(int i=2;i*i<a+1;i++)
	{
		if(a%i==0)
		{ return getmax(a/i)>getmax(i)?getmax(a/i):getmax(i);
		}	
	}
		return a;// 如果找不到因数他自己就是最大素因数
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

如果对后端、爬虫、数据结构算法等感性趣欢迎关注我的个人公众号交流:bigsai

文章来源: bigsai.blog.csdn.net,作者:Big sai,版权归原作者所有,如需转载,请联系作者。

原文链接:bigsai.blog.csdn.net/article/details/83098791

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。