Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package atomicdiamond.euler.id26_50;
- import static vrabus.euler.common.CommonUtilities.isPrime;
- import java.util.ArrayList;
- /**
- * @see <a href="https://projecteuler.net/problem=35">Webpage</a>
- */
- public class ID035_CircularPrimes {
- static int target = 1_000_000;
- static boolean[] cPrimes = new boolean[target + 1];
- public static void main(String[] args) {
- // take advantage of what is already given
- int[] given = { 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97 };
- long count = 0;
- for (int i : given) {
- cPrimes[i] = true;
- }
- // Actualy logic starts here
- for (int ret = 0; ;) {
- ret = Generator.getNext();
- if (ret > target) {
- break;
- }
- doCyclic(String.valueOf(ret));
- }
- for (int i = 0; i < cPrimes.length; i++) {
- if (cPrimes[i]) {
- System.out.println(i);
- count++;
- }
- }
- System.out.println("count = " + count);
- }
- private static void doCyclic(String num) {
- ArrayList<Integer> n = new ArrayList<>(num.length());
- ArrayList<Integer> cycles = new ArrayList<>(num.length());
- for (int i = 0; i < num.length(); i++) {
- n.add(Integer.parseInt(num.substring(i, i+1)));
- }
- int size = n.size();
- boolean isCPrime = true;
- for (int i = 0; i < size; i++) {
- cycles.add(convertArrayToNum(n));
- isCPrime = isCPrime && isPrime(cycles.get(cycles.size()-1));
- doCycle(n, size);
- if (convertArrayToNum(n) > target) {
- return;
- }
- }
- if (isCPrime) {
- for (int i = 0; i < size; i++) {
- try {
- cPrimes[cycles.get(i)] = true;
- } catch (ArrayIndexOutOfBoundsException e) {
- }
- }
- }
- }
- private static void doCycle(ArrayList<Integer> n, int size) {
- int first = n.get(0);
- for (int j = 0; j < size-1; j++) {
- n.set(j, n.get(j+1));
- }
- n.set(n.size()-1, first);
- }
- private static int convertArrayToNum(ArrayList<Integer> num) {
- int ret = 0;
- for (int i = 0; i < num.size(); i++) {
- ret += (num.get(i) * Math.pow(10, i));
- }
- return ret;
- }
- /**
- * A circular prime bigger than 9 must end in one of four digits: { 1, 3, 7, 9 }. That's why this even exists
- */
- static class Generator {
- // the number is read backwards
- private static ArrayList<SubGenerator> num = new ArrayList<>();
- private static boolean isFirst = true;
- static {
- num.add(new SubGenerator());
- num.add(new SubGenerator());
- num.add(new SubGenerator());
- }
- public static int getNext() {
- if (!isFirst) {
- for (int i = 0; ; ) {
- if (i >= num.size()) {
- num.add(new SubGenerator());
- }
- if (num.get(i).getNext() == 1) {
- i++;
- } else {
- break;
- }
- }
- } else {
- isFirst = false;
- }
- // System.out.println(Arrays.toString(num.toArray()));
- int ret = 0;
- for (int i = 0; i < num.size(); i++) {
- ret += (num.get(i).getCur() * Math.pow(10, i));
- }
- return ret;
- }
- private static class SubGenerator {
- private int cur;
- public SubGenerator() {
- this(1);
- }
- public SubGenerator(int start) {
- cur = start;
- }
- public int getCur() {
- return cur;
- }
- int getNext() {
- if (cur >= 9) {
- cur = -1;
- }
- cur += 2;
- if (cur % 5 == 0) {
- return getNext();
- }
- return cur;
- }
- @Override
- public String toString() {
- return String.valueOf(cur);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement