2# 题目
13195的质数因子有5,7,13和29.
600851475143的最大质数因子是多少?
解题方法
方法1
- 题目要求最大的质数因子,所以我们需要一个判断一个数是否为质数的函数,判断从2开始到max的数是否为质数。max这个上界取600851475143的平方根。
- 以160做演示,将160依次对素数数组的每个元素进行求余,如果余数为0代表能整除,那么就将160除以这个素数,结果作为新的数继续对这个素数进行整除判断,如果可以整除,则继续以相除的结果作为新的开始。
- 当num为1时,返回最后一个除数(素数)即5,数值变化参照下表
变量 | 值 | 除数(素数) |
---|---|---|
num | 160 | 2 |
num | 80 | 2 |
num | 40 | 2 |
num | 20 | 2 |
num | 10 | 2 |
num | 5 | 5 |
num | 1 |
程序
程序中用到的Prime类是我自定义的工具类,因为在做欧拉工程的题目遇到很多素数相关的题目,所以我实现了一个Prime工具类,方便解题。具体的源码以及用法参考我的另一篇文章——《Java工具类 素数类》
public static void solve() {
long num = 600851475143L;
int[] primeArray = Prime.getPrimeArrayBelow((int) Math.sqrt(num));
int i = 0;
for (; num != 1; i++) {
while (num % primeArray[i] == 0) {
num /= primeArray[i];
}
}
System.out.println(primeArray[i - 1]);
}
方法2
方法1从最小的质数开始除,直到将num除尽,方法2则从上界开始除。
程序
public static void solve() {
long num = 600851475143L;
int[] primeArray = Prime.getPrimeArrayBelow((int) Math.sqrt(num));
for (int i = primeArray.length - 1; i != -1 ; i--) {
if (num % primeArray[i] == 0) {
System.out.println(primeArray[i]);
break;
}
}
}