我正在尝试Project Euler 的问题 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 语句来中断。我编辑了上面的代码以反映这些变化。
我的算法在计算主要因素时仍然是错误的,所以我需要看看它,也许会提出一个新问题。