- 子串可整除性
数字 1406357289 由 0 至 9 的各位数构成,因此是一个 0 至 9 的全数字,除此之外,它还有
一个有趣的子串可整除性质。设 d1 表示第一位数,d2 表示第二位数等等,可以发现:
求所有满足这个性质的 0 至 9 的全数字之和。
答案:16695334890
(满足条件的全数字有 6 个:1406357289, 1430952867, 1460357289, 4106357289, 4130952867,
4160357289)
代码如下:
public static int[] array=new int[]{2,3,5,7,11,13,17};
public static boolean complete(String s){
char[] temp=s.toCharArray();
Arrays.sort(temp);
if(new String(temp).equals("0123456789")) return true;
else return false;
}
public static boolean div(String s){
int t1,t2,t3,m;
for(int i=1;i<=7;i++){
t1=s.charAt(i)-'0';
t2=s.charAt(i+1)-'0';
t3=s.charAt(i+2)-'0';
m=t1*100+t2*10+t3;
if(m%array[i-1]!=0) return false;
}
return true;
}
public static long num(){
long l=0;
for(long i=9876543201l;i>=1023456789;i--){
String s=Long.toString(i);
if(complete(s)&&div(s)) l+=i;
}
return l;
}
public static void main(String[] args) {
System.out.println(num());
}
程序运行结果:
运行时间太长了,也许应该去了解一下排列组合了
注意:字符数组不能直接和字符串用equals比较,会出错
第二种方法:将10个数字进行排列(递归回溯,效率增快了不少)
代码如下:
public static int[] array=new int[]{2,3,5,7,11,13,17};
public static int[] nums = {0, 1, 2, 3,4,5,6,7,8,9};
public static ArrayList<ArrayList<Integer>> result = new ArrayList<>();
public static void permuation(ArrayList<Integer> inner) {
if (inner.size() == nums.length) {
result.add(new ArrayList<>(inner));
return;
}
for(int i=0; i<nums.length; i++) {
if (inner.contains(nums[i])) {
continue;
}
inner.add(nums[i]);
// System.out.println(i+"A"+nums[i]);
// System.out.println(inner);
permuation(inner);
inner.remove(inner.size()-1);
}
}
public static boolean div(String s){
int t1,t2,t3,m;
for(int i=1;i<=7;i++){
t1=s.charAt(i)-'0';
t2=s.charAt(i+1)-'0';
t3=s.charAt(i+2)-'0';
m=t1*100+t2*10+t3;
if(m%array[i-1]!=0) return false;
}
return true;
}
public static void main(String[] args) {
ArrayList<Integer> inner = new ArrayList<>();
String s="";
long l=0l;
permuation(inner);
for(ArrayList<Integer> each: result) {
s="";
if(each.get(0)==0) continue;
for(int i=0;i< each.size();i++){
s+=Integer.toString(each.get(i));
// System.out.println(s);
// break;
}
if(div(s))
l+=Long.parseLong(s);
// System.out.println(s);
}
System.out.println(l);
}