Advertisement
Guest User

[ProjectEuler] ID035 Circular Primes (Overkill Edition)

a guest
Jan 22nd, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.46 KB | None | 0 0
  1. package atomicdiamond.euler.id26_50;
  2.  
  3. import static vrabus.euler.common.CommonUtilities.isPrime;
  4.  
  5. import java.util.ArrayList;
  6.  
  7. /**
  8.  * @see <a href="https://projecteuler.net/problem=35">Webpage</a>
  9.  */
  10. public class ID035_CircularPrimes {
  11.     static int target = 1_000_000;
  12.     static boolean[] cPrimes = new boolean[target + 1];
  13.  
  14.     public static void main(String[] args) {
  15.        
  16.         // take advantage of what is already given
  17.         int[] given = { 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97 };
  18.        
  19.         long count = 0;
  20.        
  21.         for (int i : given) {
  22.             cPrimes[i] = true;
  23.         }
  24.        
  25.         // Actualy logic starts here
  26.         for (int ret = 0; ;) {
  27.             ret = Generator.getNext();
  28.             if (ret > target) {
  29.                 break;
  30.             }
  31.             doCyclic(String.valueOf(ret));
  32.         }
  33.        
  34.         for (int i = 0; i < cPrimes.length; i++) {
  35.             if (cPrimes[i]) {
  36.                 System.out.println(i);
  37.                 count++;
  38.             }
  39.            
  40.         }
  41.        
  42.        
  43.         System.out.println("count = " + count);
  44.        
  45.     }
  46.    
  47.     private static void doCyclic(String num) {
  48.         ArrayList<Integer> n = new ArrayList<>(num.length());
  49.         ArrayList<Integer> cycles = new ArrayList<>(num.length());
  50.        
  51.         for (int i = 0; i < num.length(); i++) {
  52.             n.add(Integer.parseInt(num.substring(i, i+1)));
  53.         }
  54.        
  55.         int size = n.size();
  56.        
  57.         boolean isCPrime = true;
  58.         for (int i = 0; i < size; i++) {
  59.             cycles.add(convertArrayToNum(n));
  60.             isCPrime = isCPrime && isPrime(cycles.get(cycles.size()-1));
  61.             doCycle(n, size);
  62.             if (convertArrayToNum(n) > target) {
  63.                 return;
  64.             }
  65.         }
  66.        
  67.         if (isCPrime) {
  68.             for (int i = 0; i < size; i++) {
  69.                 try {
  70.                     cPrimes[cycles.get(i)] = true;
  71.                 } catch (ArrayIndexOutOfBoundsException e) {
  72.                 }
  73.             }
  74.            
  75.         }
  76.        
  77.     }
  78.  
  79.     private static void doCycle(ArrayList<Integer> n, int size) {
  80.         int first = n.get(0);
  81.         for (int j = 0; j < size-1; j++) {
  82.             n.set(j, n.get(j+1));
  83.         }
  84.         n.set(n.size()-1, first);
  85.     }
  86.    
  87.    
  88.    
  89.     private static int convertArrayToNum(ArrayList<Integer> num) {
  90.         int ret = 0;
  91.         for (int i = 0; i < num.size(); i++) {
  92.             ret += (num.get(i) * Math.pow(10, i));
  93.         }
  94.         return ret;
  95.     }
  96.     /**
  97.      * A circular prime bigger than 9 must end in one of four digits: { 1, 3, 7, 9 }. That's why this even exists
  98.      */
  99.     static class Generator {
  100.        
  101.         // the number is read backwards
  102.         private static ArrayList<SubGenerator> num = new ArrayList<>();
  103.         private static boolean isFirst = true;
  104.        
  105.         static {
  106.             num.add(new SubGenerator());
  107.             num.add(new SubGenerator());
  108.             num.add(new SubGenerator());
  109.         }
  110.        
  111.         public static int getNext() {
  112.             if (!isFirst) {
  113.                
  114.                 for (int i = 0; ; ) {
  115.                     if (i >= num.size()) {
  116.                         num.add(new SubGenerator());
  117.                     }
  118.                    
  119.                     if (num.get(i).getNext() == 1) {
  120.                         i++;
  121.                     } else {
  122.                         break;
  123.                     }
  124.                 }
  125.            
  126.             } else {
  127.                 isFirst = false;
  128.             }
  129.            
  130. //          System.out.println(Arrays.toString(num.toArray()));
  131.            
  132.             int ret = 0;
  133.             for (int i = 0; i < num.size(); i++) {
  134.                 ret += (num.get(i).getCur() * Math.pow(10, i));
  135.             }
  136.             return ret;
  137.         }
  138.        
  139.         private static class SubGenerator {
  140.             private int cur;
  141.            
  142.             public SubGenerator() {
  143.                 this(1);
  144.             }
  145.            
  146.             public SubGenerator(int start) {
  147.                 cur = start;
  148.             }
  149.            
  150.             public int getCur() {
  151.                 return cur;
  152.             }
  153.            
  154.             int getNext() {
  155.                 if (cur >= 9) {
  156.                     cur = -1;
  157.                 }
  158.                
  159.                 cur += 2;
  160.                
  161.                 if (cur % 5 == 0) {
  162.                     return getNext();
  163.                 }
  164.                
  165.                 return cur;
  166.             }
  167.            
  168.             @Override
  169.             public String toString() {
  170.                 return String.valueOf(cur);
  171.             }
  172.         }
  173.        
  174.     }
  175.    
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement