project euler 43
2015-12-04 21:26
197 查看
Problem
43
Sub-string divisibilityThe number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property.
Let d1 be the 1st digit, d2 be
the 2nd digit, and so on. In this way, we note the following:
d2d3d4=406
is divisible by 2
d3d4d5=063
is divisible by 3
d4d5d6=635
is divisible by 5
d5d6d7=357
is divisible by 7
d6d7d8=572
is divisible by 11
d7d8d9=728
is divisible by 13
d8d9d10=289
is divisible by 17
Find the sum of all 0 to 9 pandigital numbers with this property.
子串的可整除性
1406357289是一个0至9全数字数,因为它由0到9这十个数字排列而成;但除此之外,它还有一个有趣的性质:子串的可整除性。
记d1是它的第一个数字,d2是第二个数字,依此类推,我们注意到:
d2d3d4=406能被2整除
d3d4d5=063能被3整除
d4d5d6=635能被5整除
d5d6d7=357能被7整除
d6d7d8=572能被11整除
d7d8d9=728能被13整除
d8d9d10=289能被17整除
找出所有满足同样性质的0至9全数字数,并求它们的和。
@Test public void test() { Combination comb = new Combination(10, 0); List<int[]> combinations = comb.generateCom(); long sum = 0; for (int i = 0; i < combinations.size(); i++) { int[] arr = combinations.get(i); if (checkNum(arr, comb)) { long val = comb.getIntVal(arr); sum += val; System.out.println(val); } } System.out.println("sum=" + sum); } public boolean checkNum(int[] arr, Combination comb) { return (comb.getIntVal(Arrays.copyOfRange(arr, 1, 4)) % 2 == 0) && (comb.getIntVal(Arrays.copyOfRange(arr, 2, 5)) % 3 == 0) && (comb.getIntVal(Arrays.copyOfRange(arr, 3, 6)) % 5 == 0) && (comb.getIntVal(Arrays.copyOfRange(arr, 4, 7)) % 7 == 0) && (comb.getIntVal(Arrays.copyOfRange(arr, 5, 8)) % 11 == 0) && (comb.getIntVal(Arrays.copyOfRange(arr, 6, 9)) % 13 == 0) && (comb.getIntVal(Arrays.copyOfRange(arr, 7, 10)) % 17 == 0); } public static class Combination { private int[] startArr; public Combination(int size) { this(size, 1); } public Combination(int size, int startNum) { startArr = new int[size]; for (int i = 0; i < size; i++) { startArr[i] = i + startNum; } } public List<int[]> generateCom() { List<int[]> ret = new ArrayList<int[]>(); ret.add(Arrays.copyOf(startArr, startArr.length)); while (true) { int lastAsc = findLastAsc(startArr); if (lastAsc == -1) { break; } int lasBigThanAsc = findBigThanAsc(startArr, lastAsc); exchangeEach(lastAsc, lasBigThanAsc, startArr); ret.add(Arrays.copyOf(startArr, startArr.length)); } return ret; } private int findBigThanAsc(int[] startArr2, int lastAsc) { int i = 0; for (i = startArr2.length - 1; i > lastAsc; i--) { if (startArr2[i] > startArr2[lastAsc]) { return i; } } assert (i > lastAsc); return i; } private void exchangeEach(int lastAsc, int lasBigThanAsc, int[] startArr2) { int temp = startArr2[lastAsc]; startArr2[lastAsc] = startArr2[lasBigThanAsc]; startArr2[lasBigThanAsc] = temp; int[] sortArr = getCopyArr(lastAsc + 1, startArr2); for (int i = 0; i < sortArr.length / 2; i++) { temp = sortArr[sortArr.length - 1 - i]; sortArr[sortArr.length - 1 - i] = sortArr[i]; sortArr[i] = temp; } for (int i = lastAsc + 1; i < startArr2.length; i++) { startArr2[i] = sortArr[i - lastAsc - 1]; } } private int[] getCopyArr(int start, int[] startArr2) { int[] ret = new int[startArr2.length - start]; for (int i = start; i < startArr2.length; i++) { ret[i - start] = startArr2[i]; } return ret; } private int findLastAsc(int[] startArr2) { for (int i = startArr2.length - 1; i > 0; i--) { if (startArr2[i] > startArr2[i - 1]) { return i - 1; } } return -1; } public long getIntVal(int[] arr) { long sum = arr[0]; for (int i = 1; i < arr.length; i++) { sum = sum * 10 + arr[i]; } return sum; } }
相关文章推荐
- 在opencv3中利用SVM进行图像目标检测和分类
- 集群瓶颈为什么是磁盘io
- OC 中的方法
- CSS属性和值--备份
- 红黑树
- 趣学Python-教孩子学编程--第十三章
- 【OpenCV入门教程之七】 玩转OpenCV源代码:生成OpenCV工程解决方案与OpenCV源码编译
- C++学习笔记2015.10.5
- php微信公众帐号发送红包
- [leetcode] Super Ugly Number
- 使用Gson解析json格式的字符串的正确方式
- hdu1029 B - Ignatius and the Princess IV
- light--oj--1116--Ekka Dokka(数学问题)
- python基础教程共60课-第3课IDE
- project euler 41
- 初探动态规划之数字三角形
- linux 安装mysql
- 利用JQuery jqprint实现打印功能
- 计算理论中的莱斯定理(Rice's Theorem)——证明与应用
- [置顶] 亮仔移植u-boot系列之-- S3c2440在最新版本U-boot-2015.10移植(支持SPL模式启动) -- 1