问题描述:
The 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.
解决问题:
package projecteuler; import java.util.Arrays; public class Problem43 { public static final Long UP = 9876543210L; public static final int START = 123; public static final int HIGH = 9; public static int[] Number = new int[9]; public static final int[] Element = {0,1,2,3,4,5,6,7,8,9}; public static final int[] prime = {2,3,5,7,11,13,17}; public static long sum = 0; public static long Factorial(int number){ long r = 1; for(int i=number; i>1; i--){ r *= i; } return r; } public static long ai_find(int Last){ Arrays.fill(Number, 0); int remain = Last-1; int high = HIGH; int posititon = 0; while(remain!=0){ long value = Factorial(high); long num = 0; if(remain>=value){ num = remain/value; remain -= value*num; Number[posititon] = (int)num; }else{ Number[posititon] = 0; } // System.out.println("Position:"+posititon+",value:"+value+",num:"+num+",remain:"+remain); posititon++; high--; } boolean[] matcher = new boolean[10]; Arrays.fill(matcher, false); String str = ""; long value = 0; for(int i=0;i<Number.length; i++){ int index = 0; for(int j=0; j<matcher.length; j++){ if(index==Number[i]&&!matcher[j]){ str = str + j; value = value*10 + j; matcher[j] = true; break; } if(!matcher[j]){ index++; } } } for(int i=0; i<matcher.length; i++){ if(!matcher[i]){ value = value*10 + i; str = str + i; } } // System.out.println(str); // System.out.println("i:"+value); return value; } public static void find(int level, boolean[] elements, long result) { if (level == 0) { if(IsNumber(result)){ sum += result; } // System.out.println(result); return; } for (int i = 0; i < elements.length; i++) { if (elements[i]) { elements[i] = false; long tmp = result; result = result * 10 + i; find(level - 1, elements, result); elements[i] = true; result = tmp; } // System.out.println("Level:"+level+",i:"+i+",Result:"+result); } } public static boolean IsPandigital(long number){ boolean[] elements = new boolean[10]; Arrays.fill(elements, true); if(number<=987654321){ for(int i=1; i<10;i++){ int cur = (int)number%10; if(!elements[cur]){ return false; } number = number/10; elements[cur] = false; } return true; }else{ for(int i=0; i<10;i++){ int cur = (int)number%10; if(!elements[cur]){ return false; } number = number/10; elements[cur] = false; } return true; } } public static boolean IsNumber(long number){ long init = number; int divide = 1000000; if(number<=987654321){ for(int i=0; i<prime.length; i++){ long value = number/divide; if(value%prime[i]!=0){ return false; } number = number %10; divide = divide/10; } return true; }else{ number = number%1000000000; // System.out.println("number:"+number); for(int i=0; i<prime.length; i++){ long value = number/divide; // System.out.println(value); if(value%prime[i]!=0){ return false; } number = number%(divide*100); divide = divide/10; } return true; } } public static void main(String[] args){ int result = 0; boolean[] elements= new boolean [10]; Arrays.fill(elements, true); find(10, elements, result); System.out.println(IsNumber(1406357289)); System.out.println(sum); } }