Я пытался решить эту проблему Project Euler Question .Я реализовал сито Euler в качестве вспомогательного класса в Java.Это работает довольно хорошо для небольших номеров.Но когда я ввожу 2 миллиона как предел, он не возвращает ответ.Я использую Netbeans IDE.Я ждал много часов, но ответа так и не было.Когда я остановил выполнение кода, он дал следующий результат
Результат Java: 2147483647
BUILD SUCCESSFUL (общее время: 2 097 минут 43 секунды)
Этот ответэто неверно.Даже после ожидания так много времени, это не правильно.Хотя тот же код возвращает правильные ответы для меньших пределов.
Сито Эйлера имеет очень простой алгоритм, данный у основания страницы .
Моя реализация такова:
package support;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author admin
*/
public class SieveOfEuler {
int upperLimit;
List<Integer> primeNumbers;
public SieveOfEuler(int upperLimit){
this.upperLimit = upperLimit;
primeNumbers = new ArrayList<Integer>();
for(int i = 2 ; i <= upperLimit ; i++)
primeNumbers.add(i);
generatePrimes();
}
private void generatePrimes(){
int currentPrimeIndex = 0;
int currentPrime = 2;
while(currentPrime <= Math.sqrt(upperLimit)){
ArrayList<Integer> toBeRemoved = new ArrayList<Integer>();
for(int i = currentPrimeIndex ; i < primeNumbers.size() ; i++){
int multiplier = primeNumbers.get(i);
toBeRemoved.add(currentPrime * multiplier);
}
for(Integer i : toBeRemoved){
primeNumbers.remove(i);
}
currentPrimeIndex++;
currentPrime = primeNumbers.get(currentPrimeIndex);
}
}
public List getPrimes(){
return primeNumbers;
}
public void displayPrimes(){
for(double i : primeNumbers)
System.out.println(i);
}
}
Я озадачен!Мои вопросы
1) Почему это занимает так много времени?Что-то не так в том, что я делаю?
Пожалуйста, предложите способы улучшить мой стиль кодирования, если вы обнаружите что-то неправильное.
Вопрос обновлен:
Вот кодгде я вычисляю сумму вычисленных простых чисел:
package projecteuler;
import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import support.SieveOfEuler;
/**
*
* @author admin
*/
public class Problem10 {
private int upperLimit;
private BigInteger sumOfPrimes;
public void getInput() {
try {
System.out.println("Enter the upper limit");
upperLimit = Integer.parseInt(br.readLine());
} catch (IOException ex) {
Logger.getLogger(Problem10.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void execute() {
BigInteger sum = new BigInteger("0");
SieveOfEuler soe = new SieveOfEuler(upperLimit);
ArrayList<Integer> primeNumbers = (ArrayList<Integer>)soe.getPrimes();
for(int i : primeNumbers){
sum = sum.add(new BigInteger(Integer.toString(i))) ;
}
System.out.println(sum);
}
public void printOutput() {
//System.out.println(sumOfPrimes);
}
}