【发布时间】:2011-05-15 11:23:05
【问题描述】:
我正在研究一个用 Java 实现的素数分解程序。 目标是找到 600851475143 (Project Euler problem 3) 的最大素数。 我想我已经完成了大部分工作,但我遇到了一些错误。 此外,我的逻辑似乎不正确,特别是我设置的用于检查数字是否为素数的方法。
public class PrimeFactor {
public static void main(String[] args) {
int count = 0;
for (int i = 0; i < Math.sqrt(600851475143L); i++) {
if (Prime(i) && i % Math.sqrt(600851475143L) == 0) {
count = i;
System.out.println(count);
}
}
}
public static boolean Prime(int n) {
boolean isPrime = false;
// A number is prime iff it is divisible by 1 and itself only
if (n % n == 0 && n % 1 == 0) {
isPrime = true;
}
return isPrime;
}
}
编辑
public class PrimeFactor {
public static void main(String[] args) {
for (int i = 2; i <= 600851475143L; i++) {
if (isPrime(i) == true) {
System.out.println(i);
}
}
}
public static boolean isPrime(int number) {
if (number == 1) return false;
if (number == 2) return true;
if (number % 2 == 0) return false;
for (int i = 3; i <= number; i++) {
if (number % i == 0) return false;
}
return true;
}
}
【问题讨论】:
-
您遇到什么错误?你在哪一行得到错误?
-
您的 Prime 方法总是返回 true,因为
n%n == 0 && n%1 == 0代表所有n。也就是说,所有数字都可以被自己和 1 整除。您缺少定义的“唯一”部分。 -
不幸的是,你甚至没有接近。您的素数算法不起作用,因为所有数字都可以被自己和零整除 - 只是素数不能被其他任何东西整除,您必须对此进行检查。 Erasthones 筛需要 600GB 的 RAM 才能运行到 600B 范围内的值,因此递归素数分解是唯一实用的策略,而且问题空间很大,需要数小时或数天。这是所有现代加密的基础:大于 RAM 大小的素数分解非常慢。
-
是的,这是逻辑错误之一,我该如何解决?
-
@Adam,我认为您的意思是“可被自己整除并且 一个 ”。