【发布时间】:2013-03-17 00:04:23
【问题描述】:
我正在尝试来自 Project Euler 的 Problem 3,但我的算法太慢了。有谁知道如何优化这个?我要计算的数字是 600851475143L。计算这个需要很长时间,所以我需要一种方法来加快计算速度。
逻辑:
- 遍历从 3 到该数字 1 的所有数字
- 对于这些数字中的每一个,通过将它们除以它们之间的所有数字来检查它们是否为素数,如果它们不除以它们中的任何一个,则它们是素数。
-
如果是素数,则将它们添加到数组中。
public static void problem3(long number){ long number2 = number; long sqrtNumber = (long)Math.sqrt(number2); int indexNum = 1; boolean isPrime = false; int primeNums[] = new int[2]; primeNums[0] = 2; //puts prime numbers into an array for(int y = 3; y < sqrtNumber; y++){ isPrime=true; for(int theNum = 2; theNum < y; theNum++){ //if y divides evenly by any number then it is not prime if(y%theNum==0){ //dont store in array isPrime=false; break; } } if(isPrime == true){ //add to array System.out.println(y); //put y in the array and exapnd the array //System.out.println("y: " + y); primeNums[indexNum] = y; int[] newArray = new int[primeNums.length + 1]; System.arraycopy(primeNums, 0, newArray, 0, primeNums.length); primeNums = newArray; indexNum++; } }
********** 更新 **************
我计算到平方根,这大大加快了计算速度,但我还做了其他事情,即在我发现数字不是素数时在 forloop 中添加一个 break 语句来中断。我编辑了上面的代码以反映这些变化。
虽然我的算法在计算质因数方面仍然是错误的,所以我需要看看它,也许会提出一个新问题。
【问题讨论】:
-
您应该实现Sieve of Eratosthenes 以解决问题。
-
通过试除法进行简单的因式分解最多需要几毫秒(此处小于 100 微秒)。
-
请去掉所有令人困惑的
**edit**注释。没有人关心您遇到的错误,并且版本控制可供任何人检查。您的代码目前不可读。 -
Project Euler 的问题 3 不会要求您提供低于 600851475143 的所有素数,也不会要求您提供低于 600851475143 的最大素数。它会要求您提供 600851475143 的最大素数,即这样的数字
d600851475143 % d == 0。 Google Search for problem 3 on StackOverflow shows 7460 hits.
标签: java performance algorithm primes