|
1 | 1 | package Challenges_VII.Summation_Of_Four_Primes;
|
2 | 2 |
|
3 | 3 | import java.util.ArrayList;
|
| 4 | +import java.util.HashMap; |
4 | 5 | import java.util.Scanner;
|
5 | 6 |
|
6 | 7 | public class Main {
|
7 | 8 |
|
8 | 9 | public static ArrayList<Integer> primeList;
|
| 10 | + public static HashMap<String, Integer> primeHash; |
| 11 | + public static final int MAX = 10000000; |
9 | 12 |
|
10 | 13 | public static void main(String[] args) {
|
11 | 14 | Scanner s = new Scanner(System.in);
|
12 | 15 | primeList = new ArrayList<Integer>();
|
13 |
| - genPrimes(); |
14 |
| - try{ |
| 16 | + primeHash = new HashMap<String,Integer>(); |
| 17 | + genPrimes(); |
| 18 | + try { |
15 | 19 | while (true) {
|
16 | 20 | String primes = "";
|
17 | 21 | int next = Integer.parseInt(s.nextLine().trim());
|
18 |
| - if (next > 8) { |
| 22 | + if (next >= 8) { |
19 | 23 | if ((next - 4) % 2 == 0) {
|
20 | 24 | next -= 4;
|
21 | 25 | primes += "2 2 ";
|
22 | 26 | } else {
|
23 | 27 | next -= 5;
|
24 | 28 | primes += "2 3 ";
|
25 | 29 | }
|
26 |
| - |
| 30 | + |
27 | 31 | for (int p : primeList) {
|
28 |
| - if (primeList.contains(next - p)) { |
29 |
| - primes += p + " " + primeList.get(primeList.indexOf(next - p)); |
| 32 | + int potential = next - p; |
| 33 | + if (primeHash.get(String.valueOf(potential)) != null) { |
| 34 | + primes += p + " " + potential; |
30 | 35 | break;
|
31 | 36 | }
|
32 | 37 | }
|
33 |
| - |
| 38 | + System.out.println(primes.trim()); |
| 39 | + |
34 | 40 | } else {
|
35 |
| - int temp = 0; |
36 |
| - while (temp != next) { |
37 |
| - temp += 2; |
38 |
| - primes += "2 "; |
39 |
| - } |
| 41 | + System.out.println("Impossible."); |
40 | 42 | }
|
41 |
| - System.out.println(primes.trim()); |
| 43 | + |
42 | 44 | }
|
43 |
| - }catch(Exception e){ |
| 45 | + } catch (Exception e) { |
44 | 46 | s.close();
|
45 | 47 | System.exit(0);
|
46 | 48 | }
|
47 | 49 |
|
48 | 50 | }
|
49 | 51 |
|
50 |
| - public static void genPrimes() { |
51 |
| - primeList.add(2); |
52 |
| - for (int i = 3; i < 1000000; i++) { |
53 |
| - if (i % 2 != 0) { |
54 |
| - int rootX = (int) Math.sqrt(i); |
55 |
| - boolean divisible = false; |
56 |
| - for (int j = 2; j < rootX + 1; j++) { |
57 |
| - if (i % j == 0) { |
58 |
| - divisible = true; |
59 |
| - break; |
60 |
| - } |
61 |
| - } |
62 |
| - if (!divisible) { |
63 |
| - primeList.add(i); |
64 |
| - } |
| 52 | + public static void genPrimes(){ |
| 53 | + |
| 54 | + boolean[] sieve = new boolean[MAX+1]; |
| 55 | + sieve[0] = true; |
| 56 | + sieve[1] = true; |
| 57 | + sieve[2] = false; |
65 | 58 |
|
66 |
| - } |
67 |
| - } |
68 |
| - } |
| 59 | + for(int i = 4; i <= MAX; i+=2) |
| 60 | + sieve[i] = true; |
| 61 | + |
| 62 | + for(int i = 3; i < (int)Math.sqrt(MAX)+1; i+=2) |
| 63 | + { |
| 64 | + if(!sieve[i]) |
| 65 | + { |
| 66 | + for(int j = i*i; j <= MAX; j+=i) |
| 67 | + sieve[j] = true; |
| 68 | + } |
| 69 | + } |
| 70 | + |
| 71 | + for(int b = 0; b < sieve.length; b++){ |
| 72 | + if(!sieve[b]){ |
| 73 | + primeList.add(b); |
| 74 | + primeHash.put(String.valueOf(b), b); |
| 75 | + } |
| 76 | + } |
69 | 77 |
|
| 78 | + } |
70 | 79 | }
|
0 commit comments