Find the greatest product of five consecutive digits in the 1000-digit number
I would like to know how could I resolve this problem(it's not a school stuff, I program as an hobby, I'm doing the Euler's exercises). The problem in my code is this: char c = greatest.charAt(i); I wondering how could I see the next i in the greatest.charAt(i). I post my code, I thank in advance who will help me.
// Find the greatest product of five consecutive digits in the 1000-digit number
import java.util.*;
import java.io.*;
public class FIVE
{
public static void main(String args[])
{
try{
String greatest = "73167176531330624919225119674426574742355349194934969835203127745063262395783180169848018694788518438586156078911294949545950173795833195285320880551112540698747158523863050715693290963295227443043557668966489504452445231617318564030987111217223831136222989342338030813533627661428280644448664523874930358907296290491560440772390713810515859307960866701724271218839987979087922749219016997208880937766572733300105336788122023542180975125454059475224352584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
long TheNUMBER = 0;
long n = 0;
long count = 0;
long provvisoryBiggest = 0;
long countZERO = 0;
long countBLOCK = 0;
long X = 0;
for ( int i=0; i < greatest.lenght(); i++)
{
for(int j=0; j<5; j++)
{
if(X == 0)
{
X = 1;
}
char c = greatest.charAt(i);
n = Character.getNumericValue(c);
count++;
System.out.println(count + "th number: " + n);
X = (X * n );
System.out.println("The product is: " + X);
while 开发者_JAVA百科(provvisoryBiggest < X)
{
provvisoryBiggest = X;
}
while(count == 5)
{
System.out.println("Now the biggest one is: " + provvisoryBiggest);
count = countZERO;
X = countZERO;
countBLOCK++;
System.out.println("Block number: "+ countBLOCK);
System.out.println("------------------------------------");
}
}
}
}
catch(ArrayIndexOutOfBoundsException ex) { System.out.println("ARRAY ERROR"); }
catch(ArithmeticException ex) { System.out.println("MATH ERROR");}
catch(NumberFormatException ex) { System.out.println("NUMBER FORMAT EXCEPTION");}
catch(StringIndexOutOfBoundsException ex) { System.out.println("INDEX ERROR"); }
}}
Looking at the output of your program, I see that it has blocks like this:
1th number: 8
The product is: 8
2th number: 8
The product is: 64
3th number: 8
The product is: 512
4th number: 8
The product is: 4096
5th number: 8
The product is: 32768
Now the biggest one is: 59049
Block number: 684
This illustrates that for your subsequence of five numbers, you're actually just multiplying one of them by itself five times.
You need to make sure you iterate that subsequence to get the product.
It looks like the problem is in your line greatest.charAt(i)
. You actually need to add the offset j
to get each digit in your five-digit subsequence.
Brute force:
String num = "73167176531330624...";
int prod = 0;
for (int i=0; i < num.length()-4; i++)
{
int tmp = (num.charAt(i) - '0')*
(num.charAt(i+1) - '0')*
(num.charAt(i+2) - '0')*
(num.charAt(i+3) - '0')*
(num.charAt(i+4) - '0');
if (tmp > prod){
prod = tmp;
}
}
return prod;
A cleaner code version:
String str = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
int i=0;
int max = 0;
while( i != (str.length() - 4)){
int val = Character.digit(str.charAt(i), 10) *
Character.digit(str.charAt(i+1), 10) *
Character.digit(str.charAt(i+2), 10) *
Character.digit(str.charAt(i+3), 10) *
Character.digit(str.charAt(i+4), 10);
if(val > max){
max = val;
}
i++;
}
System.out.println(max);
The solution is:
public class Five {
public static void main(String args[]) {
try {
String greatest = "731671765313306249192251196744265747423553491949349698352031277450632623957831801698480186947885184385861560789112949495459501737958331952853208805511125406987471585238630507156932909632952274430435576689664895044524452316173185640309871112172238311362229893423380308135336276614282806444486645238749303589072962904915604407723907138105158593079608667017242712188379087922749219016997208880937766572733300105336788122023542180975125454059475224352584907711670556013604839586446706324415722155397 5369781797784617406495514929086256932197846862248283972241375657056057490261407972968652414535100474821663704844031998900088952434506585412275886668811642717147992444292823086346567481391912316282458617866458359124566529476545682848912883142607690042242190226710556263211111093705442175069416589604080719840385096245544436298123098787992724428490918884580156166097919133875499200524063689912560717606058861164671094050775410022569831552000559357297257163626956188267042825248360082325753042075296345099879";
int n = 0;
int count = 0;
long biggest = 0;
int countBlock = 1;
int biggestBlock = 1;
long X = 1;
for (int i = 0; i < greatest.length()-4; i++) {
for (int k = i; k < i + 5; k++) {
char c = greatest.charAt(k);
n = Character.getNumericValue(c);
count++;
X = (X * n);
System.out.println("Product is:" + X);
}
if(biggest < X){
biggest = X;
biggestBlock = countBlock;
}
System.out.println("Now the biggest one is: "+ biggest);
count = 0;
X = 1;
countBlock++;
System.out.println("Block number: " + biggestBlock);
System.out.println("Block number: " + countBlock);
System.out.println("------------------------------------");
}
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("ARRAY ERROR");
} catch (ArithmeticException ex) {
System.out.println("MATH ERROR");
} catch (NumberFormatException ex) {
System.out.println("NUMBER FORMAT EXCEPTION");
} catch (StringIndexOutOfBoundsException ex) {
System.out.println("INDEX ERROR");
}
}
}
精彩评论