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 ?
求最大素因子
顾名思义,就是求素数,判断是否为给定数的因子.
于是解题思路出现,从2开始求素数,每得到一个素数(注意:偶数无需判断),就与给定数求余,若余数为零,则为因子,商作为新的给定数,重复.
当给定数为1时,循环结束.
实现后如愿得到结果.
再想,当倒数第二个因子得到后,最后一个因子再无因子,但循环仍要继续,直到循环变量为最后一个因子.
可以想到,在这个过程中,程序只是在无意义的判断素合性.
优化1出现,每次将商作为新的给定数,判断该给定数是否为素数,若为素数,则循环应结束.
效果很明显,运行时间从3ms下降到1ms.
简单分析,这其中对较大给定数进行了多次检验,但与最后一个因子之前的无效过程相比,运算明显减小.
再想,求解素数这个过程是朴素的试除.
假想,如果采用了Miller-Rabin素数检测方法,那么,仔细想想,其实效率不会有很大提高,原因是,虽然过程中有素数检测部分,但总体上是
一个求素数序列的过程,对于求素数,MR表现并不比试除好多少.
对于Miller-Rabin和Pollard的rho启发方法,之后练习.
code:
package org.lzim.euler;
/**
* Created by ManD on 2015/5/7.
*/
/**
* 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 ?
*/
public class three {
/* 暴力試探素因子 runtime average : 3ms */
/* 加:判斷商是否爲素數 runtime average : 1ms */
public static boolean isPrime(long num){
int ii=(int)Math.sqrt(num);
int j =2;
while (j<ii) {
if (num%j == 0) break;
j++;
}
return j == ii;
}
public static void main() {
long term = 600851475143L;
long t1 = System.currentTimeMillis();
for (int i = 3; term != 1; i+=2) { // 去除偶數
if ((isPrime(i)) && (term % i == 0)) {
System.out.println(i);
term /= i;
if (isPrime(term)) {
System.out.println(term);
break;
}
}
}
long t2 = System.currentTimeMillis();
System.out.println("\nIt run "+(t2 - t1)+" ms");
}
}