我正在尝试来自Project Euler的Problem 3,我的算法太慢了。有谁知道如何优化这个?我想要计算的数字是600851475143L。计算这个需要永远,所以我需要一种方法来加快计算速度。
LOGIC:
如果是素数,则将它们添加到数组中。
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语句,一旦我发现数字不是素数就打破。我编辑了上面的代码以反映这些变化。
我的算法在计算素因子时仍然是错误的,所以我需要看看它并提出一个新的问题。
答案 0 :(得分:4)
你可以做的第一件事是只测试你正在测试的数字的平方根上可能的因素,因为如果你发现一个大于平方根的因子,那么你应该找到一个小于平方根。
如果您需要其他性能,请使用Sieve of Eratosthenes。这允许您使用先前素数的结果来减少确定较大数字是否为素数的工作。
答案 1 :(得分:4)
您不必按每个数字划分。您只需将每个素数除以2和数字的平方根之间。