Advertisement
sindrijo

ProEuler_P13

Jan 27th, 2012
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.81 KB | None | 0 0
  1. package problems;
  2.  
  3. import java.util.*;
  4. import java.io.*;
  5. public class Problem_013 {
  6.  
  7. public static void main(String[] args) {
  8.     int[][] digitArray = readFile("p13_data.txt");     
  9.     System.out.println(  digitArrayToString(  ( sumDigitArrays(digitArray)  ) ) );
  10. }
  11.  
  12. public static int[] sumDigitArrays(int[][] inputArray){
  13.     int arrayLength = inputArray.length;
  14.     int[][] digitArray = inputArray;
  15.    
  16.     while(arrayLength > 2){ /* Reduce numbers to add down to 2. */
  17.         int[][] sideKickArray = addArrays(digitArray);
  18.         digitArray = sideKickArray;
  19.         arrayLength = sideKickArray.length;
  20.     }
  21.    
  22.     return sumArrays(digitArray); /* Sum last two numbers. */
  23. }
  24.  
  25.  
  26. /* This takes in a digit array containing x amount of numbers
  27.  * and returns a digit array containing pair-sums.*/
  28.  
  29. public static int[][] addArrays(int[][] inArray){
  30.    
  31.     if(inArray.length % 2 != 0){
  32.         Arrays.copyOf(inArray, inArray.length+1);
  33.         int[] zeroArray = new int[inArray[0].length+10];
  34.         inArray[inArray.length-1] = zeroArray;
  35.     }
  36.    
  37.     int[][] outArray = new int[inArray.length/2][inArray[0].length];
  38.    
  39.     if(outArray.length % 2 != 0){
  40.         outArray = Arrays.copyOf(outArray, outArray.length+1);
  41.         int[] zeroArray = new int[outArray[0].length+10];
  42.         outArray[outArray.length-1] = zeroArray;
  43.     }
  44.    
  45.     int k = 0;
  46.    
  47.     for(int i = -2; i < inArray.length-2; i+=2){
  48.        
  49.         /* Create temp array to store result. */
  50.         int[][] tempArray = new int[2][inArray[0].length];
  51.        
  52.         /* Inject data from input array into temp array. */
  53.         tempArray[0] = inArray[i+2];
  54.         tempArray[1] = inArray[i+3];
  55.        
  56.         /* Compute sum of numbers in temp array, inject to outarray at k.*/
  57.         outArray[k] = sumArrays(tempArray);
  58.         k++;
  59.     }
  60.        
  61.         return outArray;
  62. }
  63.  
  64. /* Takes two digits arrays and add them together, returning 1d digit array*/
  65. public static int[] sumArrays(int[][] inputArray){  
  66.    
  67.     /*Test if input array contains even amount of numbers, if not add zero number. */
  68.    
  69.     if(inputArray.length % 2 != 0){
  70.         Arrays.copyOf(inputArray, inputArray.length+1);
  71.         int[] zeroArray = new int[inputArray[0].length];
  72.         inputArray[inputArray.length-1] = zeroArray;
  73.     }
  74.    
  75.     /* Set input to array we compute on. Bleh. */
  76.     int[][] numDigitArray = inputArray;
  77.    
  78.     /* Extending number by one digit, in case of "precision overflow". */
  79.     for(int i = 0; i < numDigitArray.length; i++) {
  80.         numDigitArray[i] = Arrays.copyOf(numDigitArray[i], numDigitArray[i].length+1);
  81.     }
  82.    
  83.     /* Shifting digits to the right. */
  84.     for(int i = 0; i < numDigitArray.length; i++) {    
  85.         numDigitArray[i] = shiftArray(numDigitArray[i]);           
  86.     }
  87.    
  88.    
  89.     /* Initialize vars and arrays for computation. */
  90.    
  91.     int numDigits = numDigitArray[0].length;
  92.     int[] carryDigit = new int[numDigits];
  93.     int[] result = new int[numDigits];
  94.    
  95.     /* Add digits and detect carries. */
  96.     for(int j = numDigits-1; j > 0; j--) {
  97.        
  98.         if(numDigitArray[0][j] + numDigitArray[1][j] >= 10) {
  99.             result[j] = (numDigitArray[0][j] + numDigitArray[1][j])-10;
  100.             carryDigit[j-1] += 1;
  101.         } else {
  102.             result[j] = numDigitArray[0][j] + numDigitArray[1][j]; 
  103.         }      
  104.     }
  105.    
  106.     /* Add carries. */
  107.     for(int r = numDigits-1; r >= 0; r--) {
  108.        
  109.         if(result[r] + carryDigit[r] < 10){
  110.             result[r] += carryDigit[r];
  111.         } else {
  112.             carryDigit[r-1] += carryDigit[r];
  113.             result[r] = 0;
  114.         }
  115.     } return result;
  116.  
  117. } /* End of sumArrays method. */
  118.  
  119. public static int[][] readFile(String filename){
  120.    
  121.     /* Reads a file with numbers on lines, returns a 2d array
  122.      * with an array of digits of the numbers. */
  123.    
  124.     int index = 0;
  125.     int lines = 100;
  126.    
  127.     File inputFile = new File(filename);
  128.     String[] numbers = new String[lines];
  129.     int[][] digits = new int[lines][50];
  130.    
  131.     try {
  132.        
  133.         Scanner readFile = new Scanner(inputFile);
  134.        
  135.         while(readFile.hasNext() && index < lines){
  136.             numbers[index] = readFile.nextLine();
  137.             index++;
  138.         }
  139.        
  140.         for(int i = 0; i < numbers.length; i++){
  141.             for(int j = 0; j < numbers[0].length(); j++){
  142.                 digits[i][j] = Character.getNumericValue(numbers[i].charAt(j));
  143.             }
  144.         }
  145.        
  146.     } catch (FileNotFoundException e) {
  147.         System.out.println("Cant find file.");
  148.     }
  149.  
  150.     return digits;
  151.    
  152. } // End of readFile method.
  153.  
  154. public static int[] shiftArray(int[] inArray){
  155.    
  156.     int lastElem = inArray[inArray.length-1];
  157.    
  158.     for(int i = 0; i < inArray.length-1; i++) {
  159.         inArray[inArray.length-1-i] = inArray[inArray.length-2-i];         
  160.     }
  161.         inArray[0] = lastElem;
  162.     return inArray;
  163.  
  164. }
  165.  
  166. public static int[] stringToDigitArray(String input){
  167.    
  168.     int[] digits = new int[input.length()];
  169.    
  170.     for(int j = 0; j < digits.length; j++){
  171.         digits[j] = Character.getNumericValue(input.charAt(j));
  172.     }
  173.     return digits;
  174. }
  175.  
  176. public static String digitArrayToString(int[] inputArray){
  177.    
  178.     String output = "";
  179.    
  180.     for(int i = 0; i < inputArray.length; i++){
  181.         output += inputArray[i];
  182.     }
  183.     return output.replaceFirst("^0*", ""); /* Get rid of leading zeros. */
  184. }
  185.    
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement