project euler 8

来源:互联网 发布:mac截图后文件在哪里 编辑:程序博客网 时间:2024/06/10 20:56

Problem 8


Largest product in a series

The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = 5832.


73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?


连续数字最大乘积

在下面这个1000位正整数中,连续4个数字的最大乘积是 9 × 9 × 8 × 9 = 5832。


73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

找出这个1000位正整数中乘积最大的连续13个数字。它们的乘积是多少?

package projecteuler;import java.util.ArrayList;import java.util.List;import org.junit.Test;public class Prj8 {/** * The four adjacent digits in the 1000-digit number that have the greatest * product are 9 × 9 × 8 × 9 = 5832. *  * 73167176531330624919225119674426574742355349194934 * 96983520312774506326239578318016984801869478851843 * 85861560789112949495459501737958331952853208805511 * 12540698747158523863050715693290963295227443043557 * 66896648950445244523161731856403098711121722383113 * 62229893423380308135336276614282806444486645238749 * 30358907296290491560440772390713810515859307960866 * 70172427121883998797908792274921901699720888093776 * 65727333001053367881220235421809751254540594752243 * 52584907711670556013604839586446706324415722155397 * 53697817977846174064955149290862569321978468622482 * 83972241375657056057490261407972968652414535100474 * 82166370484403199890008895243450658541227588666881 * 16427171479924442928230863465674813919123162824586 * 17866458359124566529476545682848912883142607690042 * 24219022671055626321111109370544217506941658960408 * 07198403850962455444362981230987879927244284909188 * 84580156166097919133875499200524063689912560717606 * 05886116467109405077541002256983155200055935729725 * 71636269561882670428252483600823257530420752963450 Find the thirteen * adjacent digits in the 1000-digit number that have the greatest product. * What is the value of this product? */@Testpublic void test() {Region rg = new Region(0, 0).getLargest(VAL_STR);System.out.println(" start = " + rg.start + ",end =" + rg.end+ " ,val =" + rg.maxValue);}public static final String VAL_STR = "73167176531330624919225119674426574742355349194934"+ "96983520312774506326239578318016984801869478851843"+ "85861560789112949495459501737958331952853208805511"+ "12540698747158523863050715693290963295227443043557"+ "66896648950445244523161731856403098711121722383113"+ "62229893423380308135336276614282806444486645238749"+ "30358907296290491560440772390713810515859307960866"+ "70172427121883998797908792274921901699720888093776"+ "65727333001053367881220235421809751254540594752243"+ "52584907711670556013604839586446706324415722155397"+ "53697817977846174064955149290862569321978468622482"+ "83972241375657056057490261407972968652414535100474"+ "82166370484403199890008895243450658541227588666881"+ "16427171479924442928230863465674813919123162824586"+ "17866458359124566529476545682848912883142607690042"+ "24219022671055626321111109370544217506941658960408"+ "07198403850962455444362981230987879927244284909188"+ "84580156166097919133875499200524063689912560717606"+ "05886116467109405077541002256983155200055935729725"+ "71636269561882670428252483600823257530420752963450";public static class Region {public Region(int start, int end) {this.start = start;this.end = end;}public int start;public int end;public Long maxValue = (long) 0;private char[] getCharArr(String valStr) {char[] charArr = new char[valStr.length()];valStr.getChars(0, valStr.length(), charArr, 0);return charArr;}List<Region> parserRegion(char[] charArr) {List<Region> ret = new ArrayList<Region>();List<Integer> zeroId = new ArrayList<Integer>();for (int i = 0; i < charArr.length; i++) {if (charArr[i] == '0') {zeroId.add(i);}}for (int i = 0; i < zeroId.size() - 1; i++) {int start = zeroId.get(i);int end = zeroId.get(i + 1);if (i == 0) {if (start != 0) {if (start + 1 > 13) {Region rg = new Region(0, start);ret.add(rg);}} else {if (end - start + 1 > 13) {Region rg = new Region(start, end);ret.add(rg);}}continue;}if (end - start + 1 > 13) {Region rg = new Region(start, end);ret.add(rg);}}return ret;}Region calculateMax(Region rg, char[] charArr) {Region ret = new Region(rg.start, rg.end);Long sum = 1L;for (int i = rg.start; i <= rg.end - 13 + 1; i++) {Long tmp = 1L;for (int j = 0; j < 13; j++) {tmp = tmp* Integer.parseInt(new String(new char[] { charArr[i + j] }));}if (tmp > sum) {sum = tmp;ret.start = i;ret.end = i + 13;ret.maxValue = sum;}}return ret;}public Region getLargest(String valStr) {Region ret = null;char[] charArr = getCharArr(valStr);List<Region> regions = parserRegion(charArr);Long sum = 1L;for (Region rg : regions) {Region calculateRg = calculateMax(rg, charArr);if (calculateRg.maxValue > sum) {sum = calculateRg.maxValue;ret = calculateRg;}}return ret;}}}



0 0
原创粉丝点击