project euler 8
2015-12-04 20:37
197 查看
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? */ @Test public 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; } } }
相关文章推荐
- project euler 7
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- iOS 页面间几种传值方式(属性,代理,block,单例,通知)
- Python 模拟登陆数据系统
- 最小费用最大流模板
- Linux 文件系统剖析
- Android关于连接需要Portal认证的WIFI
- uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)
- 【以太网数据结构】UDP协议
- 苏黄永郦的第四周读书报告
- 游戏注册系统
- StringBuffer versus String
- project euler 6
- ZeroClipboard.js - 兼容所有浏览器的文字复制功能
- 9月22日上课笔记
- 最大流isap模板
- 开通QQ互联地址
- Redhat7配置vsftpd
- hdoj1032The Snail
- Nginx实现多域名证书HTTPS