
public class makePrimes2 {
	boolean[] sieve;
	int listOfPrimes[];
	
	void initialize_sieve () {
		for (int i=2; i<sieve.length; i++) sieve[i] = true;
	}
	
	void do_sieve () {
		for (int factor=2; factor<=Math.sqrt(sieve.length); factor++) {
			for (int j=2*factor; j<sieve.length; j+=factor)
				sieve[j] = false;
		}
	}
	
	int countSieve () {
		int n = 0;
		for (int i=2; i<sieve.length; i++)
			if (sieve[i] == true) n++;
		return n;
	}
	
	void makeListOfPrimes (int n) {
		int j = 0;
		listOfPrimes = new int[n];
		for (int i=2; i<sieve.length; i++)
			if (sieve[i] == true) listOfPrimes[j++] = i;
	}
	public makePrimes2 (int limit) {
		sieve = new boolean[limit+1];
		initialize_sieve ();
		do_sieve ();
		int n = countSieve ();
		makeListOfPrimes (n);
	}
	
	public int getNthPrime (int n) {
		if (n < listOfPrimes.length)
			return listOfPrimes[n];
		else
			return 0;
	}
}
