Problem 3 : Largest prime factor
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
1. 第3个问题:最长(大)的质因数
13195的质因数有5,7,13和29。
600851475143的最长(大)的质因数是什么?
2. 求解分析
这道题主要涉及到两个知识点:一个是质数或者素数,另一个是因数或者因子。考虑到数600851475143还是在long long可以表示的的范围之内,所以数据结构不用特别考虑。
我们需要一个函数判断一个正整数是否为质数,另外我们需要一个函数来分解一个整数的所有因数,然后判断出最大的质因数。
3. C++ 代码实现
我们定义了一个类,包含两个函数:checkPrime()和findLargestPrimeFactor()。
checkPrime用来判断一个数是否为质数,如果是质数,返回值为true,否则,返回值为false。
函数findLargestPrimeFactor()用来找到number的因数,如果因数是质数的话,则保存最大的质因数,返回值为最大的质因数。
C++ 代码
#include <iostream>
#include <cmath> // sqrtl()
#include <cassert> // assert()
using namespace std;
class PE0003
{
private:
bool checkPrime(long long number);
public:
long long findLargestPrimeFactor(long long number);
};
bool PE0003::checkPrime(long long number)
{
if (number < 2 || number > 2 && 0 == number % 2)
{
return false;
}
long double squareRoot = sqrtl((long double)number);
for(long long i=3;i<=(long long)squareRoot;i+=2) // 3, 5, 7, ...
{
if (number % i == 0)
{
return false;
}
}
return true;
}
long long PE0003::findLargestPrimeFactor(long long number)
{
long long largestPrimeFactor = 2;
long double squareRoot=sqrtl((long double)number);
for(long int n=3; n<=(long long)squareRoot; n+=2) // i = 3, 5, 7, 9, ...
{
if (number % n == 0) // n is factor of number
{
if (true == checkPrime(n))
{
if (largestPrimeFactor < n)
{
largestPrimeFactor = n;
}
}
if (n*n!= number && true == checkPrime(number/n))
{
if (largestPrimeFactor < number/n)
{
largestPrimeFactor = number/n;
}
}
}
}
return largestPrimeFactor;
}
int main()
{
PE0003 pe0003;
long long int largestPrimeFactor = pe0003.findLargestPrimeFactor(13195);
assert(29 == largestPrimeFactor);
long long number = 600851475143;
largestPrimeFactor = pe0003.findLargestPrimeFactor(number);
cout << "The largest prime factor of the number " << number;
cout << " is " << largestPrimeFactor << "." << endl;
return 0;
}
4. Python 代码实现
Python采用了和C++类似的方法,我们也定义了两个函数:checkPrime()和getLargestPrimeFactor()。
Python 代码
import math
def checkPrime(x):
if (x < 2) or (x != 2 and x%2 == 0):
return False
for i in range (3, int(math.sqrt(x))+1, 2):
if 0 == x % i:
return False
return True
def getLargestPrimeFactor(n):
largestPrimeFactor = 2
for x in range(3, int(math.sqrt(n))+1, 2):
if n % x == 0:
if True == checkPrime(x):
if largestPrimeFactor < x:
largestPrimeFactor = x
if x*x != n and True == checkPrime(n//x):
if largestPrimeFactor < n//x:
largestPrimeFactor = n//x
return largestPrimeFactor
def main():
assert 29 == getLargestPrimeFactor(13195)
print("The largest prime factor of the number 600851475143 is",
getLargestPrimeFactor(600851475143))
if __name__ == '__main__':
main()