I tried to solve this Project Euler Question . I implemented an Euler sieve as a helper class in java. This is very suitable for small numbers. But when I enter 2 million as a limit, it does not return an answer. I am using the Netbeans IDE. I waited many hours, but he still did not print out the answer. When I stopped using the code, it gave the following result:
Java Result: 2147483647
BUILDING SUCCESSFUL (total time: 2097 minutes 43 seconds)
This answer is incorrect. Even after waiting so much time, this is not true. Although the same code returns the correct answers for less restrictions.
The Euler sieve has a very simple algorithm given on the botton of this page .
My implementation is as follows:
package support; import java.util.ArrayList; import java.util.List; 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); } }
I'm confused! My questions
1) Why is it taking so long? Is there something wrong with what I'm doing?
Please suggest ways to improve your coding style if you find something is wrong.
Question updated:
Here is the code where I calculate the sum of the calculated primes:
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; 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() {
source share