[2015-03-06] Challenge #204 [Hard] Addition chains

I too tried this, in Java, here are my results:

for 19 123456

array = 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 8256 16448 32896 41152 82304 123456 
array = 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 8256 16448 32896 41152 82304 
array = 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 8256 16448 32896 41152 
array = 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 8256 16448 32896 
array = 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 8256 16448 
array = 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 8256 
array = 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 
array = 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 
array = 1 2 4 8 16 32 64 128 256 512 1024 2048 
array = 1 2 4 8 16 32 64 128 256 512 1024 
array = 1 2 4 8 16 32 64 128 256 512 
array = 1 2 4 8 16 32 64 128 256 
array = 1 2 4 8 16 32 64 128 
array = 1 2 4 8 16 32 64 
array = 1 2 4 8 16 32 
array = 1 2 4 8 16 
array = 1 2 4 8 
array = 1 2 4 
array = 1 2 
Execution Time: 45ms

For 10 127

array = 1 2 4 8 16 32 40 42 84 126 127 
array = 1 2 4 8 16 32 40 42 84 126 
array = 1 2 4 8 16 32 40 42 84 
array = 1 2 4 8 16 32 40 42 
array = 1 2 4 8 16 32 40 
array = 1 2 4 8 16 32 
array = 1 2 4 8 16 
array = 1 2 4 8 
array = 1 2 4 
array = 1 2 
Execution Time: 8ms

For 13 743

array = 1 2 4 8 16 32 64 128 160 162 290 580 742 743 
array = 1 2 4 8 16 32 64 128 160 162 290 580 742 
array = 1 2 4 8 16 32 64 128 160 162 290 580 
array = 1 2 4 8 16 32 64 128 160 162 290 
array = 1 2 4 8 16 32 64 128 160 162 
array = 1 2 4 8 16 32 64 128 160 
array = 1 2 4 8 16 32 64 128 
array = 1 2 4 8 16 32 64 
array = 1 2 4 8 16 32 
array = 1 2 4 8 16 
array = 1 2 4 8 
array = 1 2 4 
array = 1 2 
Execution Time: 14ms

I'm still running it for 25 1234567, will update once I get that output.

Here is my code:

public class AddChain {
    private static int maxIter = 25;
    private static int maxSum = 1234567;
    private static int [] arr;
    private static boolean genAddChain(int iter, int currMax) {
        if (iter >= (maxIter+1)) {
            return false;
        }
        arr[iter-1] = currMax;
        for (int i = iter-1; i>= 0; i--) {
             arr[iter] = currMax + arr[i];
             if (arr[iter]==maxSum) {
                 printArray(arr,iter+1);
                 return true;
             }
             if (genAddChain(iter+1,arr[iter])) {
                 printArray(arr,iter+1);
                 return true;
             }
        }
        for (int i = iter-1; i>= 0; i--) {
            arr[iter] = 0;
        }
        return false;
    }
    private static void printArray(int [] arr, int max) {
        StringBuffer buff = new StringBuffer();
        buff.append("array = ");
        for (int i = 0; i < max; i++) {
            buff.append(arr[i] + " ");
        }
        System.out.println(buff.toString());
    }
    public static void main(String[] args) {
        arr = new int[maxIter+1];
        for (int i = 0; i < arr.length; i++) {
            arr[i]=0;
        }
        long startTime = System.nanoTime();
        genAddChain(1,1);
        long endTime = System.nanoTime();

        long duration = (endTime - startTime); 
        System.out.println("Execution Time: " + duration/1000000 + "ms");
    }
}
/r/dailyprogrammer Thread