Reputation: 1019
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
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