Javant
Javant

Reputation: 1019

Trying to find out where I messing up on Project Euler Q8

So I am trying to solve this problem form Project Euler Question 8. I wrote something which I think is pretty good and took me some time to think about it. If I input the given test case for, I am returned with the correct answer, but when I try 13 I get an answer that is wrong.. I have no clue where I am messing up. I would love to post what result I want when I enter 13 but thats the question im trying to answer. Anyway my output currently is 8,821,658,160

@SuppressWarnings("null")
private static double largestProductSeries(String series, int num) {
    double max = 0;
    double temp = 1;
    int nextNum;
    int[] numbers = new int[num];

    //emtpy string checks
    if (series.length() == 0) {
        return (Double) null;
    }

    //Initially fill array
    for (int m = 0; m < num; m++) {
        temp *=  (numbers[m] = Character.getNumericValue(series.charAt(m)));
    }

    for (int i = num-1; i < series.length()-1; i++) {       
        if (temp > max) {
            //System.out.println("Found Max: " + Arrays.toString(numbers));
            max = temp; 
        }
        System.out.println("Eval: " + Arrays.toString(numbers));
        nextNum = Character.getNumericValue(series.charAt(i + 1));

        //Zero Optimization by skipping over zeros
        if (nextNum != 0) {
            temp = (temp / numbers[0]) * nextNum;

            for (int j = 0; j < num-1; j++){
                numbers[j] = numbers[j+1];
            }
            numbers[num-1] =  nextNum;   
        } else {
            temp = 1;
            i = getNextIndex(series, i+2, num);

            if (i == -1) {
                break;
            }

            for (int j = i, k = 0; j < num+i; j++, k++) {
                temp *= (numbers[k] = Character.getNumericValue(series.charAt(j)));
            }

            i = i + (num - 1);
        }
    }
    return max;
}

/**
 * Gets next staring index of number series to evaluate
 * @param series String of numbers
 * @param index Current index to start looking 
 * @param num size of multiplied series
 * @return Index where the next series should begin with Returns -1 if out of bounds
 */
private static int getNextIndex(String series, int index, int num) {
    if (index >= series.length() - num) {
        return -1;
    }

    String temp = series.substring(index, index + num);
    if (temp.contains("0")) {   
        return getNextIndex(series, temp.lastIndexOf('0') + 1 + index, num);
    }
    return index;
}

Upvotes: 0

Views: 45

Answers (1)

Klaus Byskov Pedersen
Klaus Byskov Pedersen

Reputation: 120937

I don't know exactly where you've messed up, but I find your solution overly complicated. Check my solution in C# and see if it helps. The solution is 23514624000.

private static long findMax(string series, int howMany)
{
    var numbers = series.Select(c => int.Parse(c.ToString())).ToArray();

    var highest = 0L;

    for (int i = 0; i < numbers.Count() - howMany; i++)
    {
        var result = 1L;
        for (int j = i; j < i + howMany; j++)
        {
            result *= numbers[j];
        }

        if (result > highest)
            highest = result;
    }

    return highest;
}

Upvotes: 1

Related Questions