【发布时间】:2012-06-22 07:45:51
【问题描述】:
所以这是 Euler 项目的问题 3。不知道的人,我要找出最大的质因数600851475143。我有以下代码:
import java.lang.Math;
// 600851475143
public class LargestPrimeFactor {
public static void main(String[] stuff) {
long num = getLong("What number do you want to analyse? ");
long[] primes = primeGenerator(num);
long result = 0;
for(int i = 0; i < primes.length; i++) {
boolean modulo2 = num % primes[i] == 0;
if(modulo2) {
result = primes[i];
}
}
System.out.println(result);
}
public static long[] primeGenerator(long limit) {
int aindex = 0;
long[] ps = new long[primeCount(limit)];
for(long i = 2; i < limit + 1; i++) {
if(primeCheck(i)) {
ps[aindex] = i;
aindex++;
}
}
return ps;
}
public static boolean primeCheck(long num) {
boolean r = false;
if(num == 2 || num == 3) {
return true;
}
else if(num == 1) {
return false;
}
for(long i = 2; i < Math.sqrt(num); i++) {
boolean modulo = num % i == 0;
if(modulo) {
r = false;
break;
}
else if(Math.sqrt(num) < i + 1 && !modulo) {
r = true;
break;
}
}
return r;
}
public static int primeCount(long limit) {
int count = 0;
if(limit == 1 || limit == 2) {
return 0;
}
for(long i = 2; i <= limit; i++) {
if(primeCheck(i)) {
count++;
}
}
return count;
}
public static long getLong(String prompt) {
System.out.print(prompt + " ");
long mrlong = input.nextLong();
input.nextLine();
return mrlong;
}
}
但是当我用小于 600851475143 的东西(很多)测试程序时,比如 100000000,那么程序需要时间 - 事实上,到目前为止,100000000 已经花费了 20 分钟并且仍在继续。我显然在这里采用了错误的方法(是的,该程序 确实 工作,我用较小的数字进行了尝试)。任何人都可以提出一个不那么详尽的方法吗?
【问题讨论】:
-
你读过一些关于素数的数学书吗?他们提供了更聪明的算法!
-
您为什么不简单地尝试Sieve of Eratosthenes 来实现您的素数检查?
-
为什么要生成最大为 num 的素数而不是 num 的平方根?如果该数不是素数,则它的因数必须小于或等于其平方根。另外,正如 Kazekage 所说,研究筛分。
-
@DavidConrad - 我是。
for(long i = 2; i < Math.sqrt(num); i++) -
@Bluefire 在 primeGenerator 和 primeCount 中,当您只需要生成不超过 limit 的平方根或大约 775 000 个的素数时,您会达到最多生成 6000 亿个素数的限制。 (您还应该将其更改为小于或等于限制的平方根,并且 primeCheck 可以变得更简单)。通过此更改,您的程序在我的笔记本电脑上运行时间为 1.2 秒。
标签: java prime-factoring