import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Scanner; import java.util.Set; public class Solution { private static final int MAX_P = 5000000; private static final List<Integer> TRIPLET_LIST = new ArrayList<Integer>(); private static final Set<Integer> TRIPLET_SET = new HashSet<Integer>(); private static int[] SIEVE = new int[MAX_P + 1]; private static boolean[] ISPRIME = new boolean[MAX_P + 1]; public static void main(String[] args) { generateTriplets(); getMaxPerimeter(); Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); while (t-- > 0) { int n = scanner.nextInt(); System.out.println(SIEVE[n]); } scanner.close(); } private static void getMaxPerimeter() { TRIPLET_LIST.addAll(TRIPLET_SET); Collections.sort(TRIPLET_LIST); for (int i = 0; i <= MAX_P; i++) { SIEVE[i] = 0; ISPRIME[i] = true; } for (int p : TRIPLET_LIST) { for (int i = p * 2; i <= MAX_P; i += p) { ISPRIME[i] = false; } } for (int p : TRIPLET_LIST) { if (!ISPRIME[p]) { continue; } for (int i = p; i <= MAX_P; i += p) { SIEVE[i]++; } } int cur = 0; int curi = 0; for (int i = 0; i <= MAX_P; i++) { if (SIEVE[i] > cur) { cur = SIEVE[i]; curi = i; } SIEVE[i] = curi; } } private static void generateTriplets() { for (int m = 3; m < 3000; m += 2) { int msq = m * m; for (int n = 1; n <= m; n += 2) { if (n != 1 && m % n == 0) { continue; } int nsq = n * n; int a = m * n; int b = (msq - nsq) / 2; int c = (msq + nsq) / 2; int p = a + b + c; if (p > MAX_P) { continue; } if (TRIPLET_SET.contains(p)) { continue; } TRIPLET_SET.add(p); } } } }
Wednesday, November 16, 2016
Project Euler #39 Integer right triangles - Java
Tuesday, November 15, 2016
Project Euler #38 Pandigital multiples - Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int k = scanner.nextInt(); generateAnswer(n, k); scanner.close(); } private static void generateAnswer(int n, int k) { boolean DEBUG = false; for (int i = 2; i <= 10000; i++) { if (i > n) { break; } boolean[] count = new boolean[10]; for (int j = 1; j <= k; j++) { count[j] = false; } // 13728 // 27456 boolean isPandigital = true; for (int j = 1; j <= 9; j++) { int prod = i * j; while (prod > 0) { int d = prod % 10; if (d > k || d == 0) { isPandigital = false; break; } if (count[d]) { if (DEBUG) { System.out.println("j=" + j + " prod=" + prod); } isPandigital = false; break; } count[d] = true; if (DEBUG) { System.out.println("prod:" + prod); System.out.println("d:" + d); print(count, 9); } prod /= 10; } if (!isPandigital) { if (DEBUG) { System.out.println("first break"); } break; } boolean allmarked = true; for (int l = 1; l <= k; l++) { if (!count[l]) { allmarked = false; } } if (allmarked) { if (DEBUG) { System.out.println("second break"); } j = 10; break; } } if (isPandigital) { System.out.println(i); } } } /** * 9 18 27 36 45 * * @param arr * @param count */ private static void print(boolean[] arr, int count) { for (int i = 1; i <= count; i++) { System.out.print(" " + arr[i] + " "); } System.out.println(); } } |
Project Euler #37 Truncatable primes - Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | import java.util.ArrayList; import java.util.Scanner; public class Solution { private static ArrayList<Long> answer = new ArrayList<Long>(); private static boolean[] sieve = new boolean[1000001]; public static void main(String[] args) { // generateData(); generateData2(); Scanner scanner = new Scanner(System.in); long n = scanner.nextLong(); long sum = 0; for (int i = 0; i < answer.size(); i++) { long d = answer.get(i); if (d > n) { break; } sum += d; } System.out.println(sum); scanner.close(); } private static void generateData2() { for (int i = 0; i <= 1000000; i++) { sieve[(int) i] = true; } sieve[0] = false; sieve[1] = false; for (int i = 2; i <= Math.sqrt(1000000); i++) { if (sieve[i]) { for (int j = i * 2; j <= 1000000; j += i) { sieve[j] = false; } } } for (long i = 11; i < 1000000; i += 2) { if (!sieve[(int) i]) { continue; } boolean DEBUG = false; long digits = (int) (Math.log10(i)); long div = (int) Math.pow(10, digits); if (DEBUG) { System.out.println("div: " + div); } long t = i % div; boolean isDirty = true; while (div > 0 && t > 0) { if (DEBUG) { System.out.println("t1: " + t); } if (!sieve[(int) t]) { isDirty = false; break; } div /= 10; if (div > 0) { t = i % div; } } if (!isDirty) { continue; } t = (int) i / 10; while (t > 0) { if (DEBUG) { System.out.println("t2: " + t); } if (!sieve[(int) t]) { isDirty = false; break; } t /= 10; } if (!isDirty) { continue; } System.out.println("d:" + i); answer.add(i); } } private static void generateData() { for (long i = 11; i < 1000000; i += 2) { long digits = (int) (Math.log10(i)); long div = (int) Math.pow(10, digits); long t = i % div; boolean isDirty = true; while (div > 0 && t > 0) { if (!isPrime(t)) { isDirty = false; break; } div /= 10; if (div > 0) { t = i % div; } } if (!isDirty) { continue; } t = (int) i / 10; while (t > 0) { if (!isPrime(t)) { isDirty = false; break; } t /= 10; } if (!isDirty) { continue; } System.out.println("d:" + i); answer.add(i); } } private static boolean isPrime(long n) { if (n <= 1) { return false; } if (n == 2 || n == 3) { return true; } if ((n & 1) != 1) { return false; } for (long i = 3; i <= Math.sqrt(n); i += 2) { if (n % i == 0) { return false; } } return true; } } |
Project Euler #36 Double-base palindromes - Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | import java.util.ArrayList; import java.util.Scanner; public class Solution { private static ArrayList<Long> answer = new ArrayList<Long>(); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); long n = scanner.nextLong(); long k = scanner.nextLong(); long sum = generateAnswer(n, k); System.out.println(sum); scanner.close(); } private static long generateAnswer(long n, long k) { long sum = 0; for (long i = 1; i <= 9; i++) { String translated = Long.toString(i, (int) k); char[] chars = translated.toCharArray(); int start = 0; int end = translated.length() - 1; boolean isPanlindrome = true; while (start < end) { if (chars[start++] != chars[end--]) { isPanlindrome = false; break; } } if (isPanlindrome) { System.out.println("i: " + i + " translated: " + translated); sum += i; answer.add(i); } } for (long i = 11; i <= n; i++) { String base10s = Long.toString(i); char[] base10 = base10s.toCharArray(); int start = 0; int end = base10s.length() - 1; boolean isPanlindrome = true; while (start < end) { if (base10[start++] != base10[end--]) { isPanlindrome = false; break; } } if (!isPanlindrome) { continue; } String translated = Long.toString(i, (int) k); char[] chars = translated.toCharArray(); start = 0; end = translated.length() - 1; isPanlindrome = true; while (start < end) { if (chars[start++] != chars[end--]) { isPanlindrome = false; break; } } if (isPanlindrome) { System.out.println("i: " + i + " translated: " + translated); sum += i; answer.add(i); } } return sum; } } |
Project Euler #35 Circular primes - Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import java.util.ArrayList; import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Solution { final private static Set<Long> answers = new HashSet<Long>(); static { answers.add((long) 2); answers.add((long) 3); answers.add((long) 5); answers.add((long) 7); } public static void main(String[] args) { getAnswers(); Scanner scanner = new Scanner(System.in); long n = scanner.nextLong(); long sum = 0; for (Long l : answers) { if (l <= n) { sum += l; } } System.out.println(sum); scanner.close(); } private static void getAnswers() { for (long i = 10; i <= 1000000; i++) { Set<Long> circles = getCircles(i); boolean test = true; if (circles == null) { continue; } for (Long l : circles) { if (!isPrime(l)) { test = false; break; } } if (test) { answers.addAll(circles); } } } private static Set<Long> getCircles(long l) { Set<Long> ret = new HashSet<Long>(); ret.add(l); final int digitLength = (int) Math.log10(l) + 1; for (int i = 0; i < digitLength; i++) { int d = (int) (l % 10); if ((d & 1) != 1 || d == 5) { return null; } d *= Math.pow(10, digitLength - 1); l /= 10; l += d; ret.add(l); } return ret; } private static boolean isPrime(long i) { if (i == 2 || i == 3) { return true; } if ((i & 1) != 1) { return false; } for (long l = 3; l <= Math.sqrt(i); l += 2) { if (i % l == 0) { return false; } } return true; } } |
Subscribe to:
Posts (Atom)