准备跟着公众号“数据结构和算法”刷题,希望能坚持下去
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;
}