古堡算式 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA
/* * 古堡算式 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!” 华生:“我猜也是!” 于是,两人沉默了好久,还是没有算出合适的结果来。 请你利用计算机的优势,找到破解的答案。 把 ABCDE 所代表的数字写出来。 答案写在“解答.txt”中,不要写在这里! */ public class TDemo02_two { public static void main(String[] args){ for(int i=10000;i<100000;i++){ int a = i/10000; int b = i%10000/1000; int c = i%10000%1000/100; int d = i%10000%1000%100/10; int e = i%10; if(a==b||a==c||a==d||a==e||b==c||b==d||b==e||c==d||c==e||d==e){ continue; } int y = e*10000+d*1000+c*100+b*10+a; if(y%i==0){ System.out.println(i+"*"+y/i+"="+y); } } } }
运行结果:
21978*4=87912
方法二:
/* * 古堡算式 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!” 华生:“我猜也是!” 于是,两人沉默了好久,还是没有算出合适的结果来。 请你利用计算机的优势,找到破解的答案。 把 ABCDE 所代表的数字写出来。 答案写在“解答.txt”中,不要写在这里! */ public class Demo02 { // 检查是否是全111111... public static boolean check(int[] b){ boolean flag = true; for(int i=0;i<b.length;i++){ if(b[i]==0){ flag = false; break; } } return flag; } // 检查是否是一个五位数 public static boolean checkFive(int[] b){ boolean flag = false; int count = 0; for(int i=0;i<b.length;i++){ if(b[i]==1){ count++; } } if(count==5) flag = true; return flag; } // 得到一个五位数字 public static String values(int[] b){ StringBuffer sb = new StringBuffer(); for(int i=0;i<b.length;i++){ if(b[i]!=0){ sb.append(i); } } return sb.toString(); } // 反转 n public static int reverse(int n){ StringBuffer sb = new StringBuffer(); sb.append(n); sb.reverse(); return Integer.parseInt(sb.toString()); } // 进位得到下一个数字 public static void modify(int[] b){ b[b.length-1]++; for(int i=b.length-1;i>0;i--){ if(b[i]>1){ b[i] = 0; b[i-1]++; } } } public static void calc(String s){ int n = Integer.parseInt(s); // 得到一个五位数字 int r = reverse(n); // 反转 n if(r%n==0) // 得到结果 n * ? = r System.out.println(n+"*"+(r/n)+"="+r); } public static void allSort(char[] c,int start,int end){ char temp = 0; if(start==end){ String s = new String(c); if((s.charAt(0)-'0')!=0){ calc(s); // 计算结果 } }else{ for(int i=start;i<=end;i++){ temp = c[start]; c[start] = c[i]; c[i] = temp; allSort(c,start+1,end); temp = c[start]; c[start] = c[i]; c[i] = temp; } } } public static void f(int[] b){ for(;;){ if(check(b)) break; // 检查是否是全111111... modify(b); // 进位,进行下一个数字的测试 if(!checkFive(b)) continue; // 检查是否是一个五位数字 String s = values(b); // 得到一个五位数字 char[] c = s.toCharArray(); allSort(c,0,c.length-1); // 全排列其中一个五位数,并计算结果 } } public static void main(String[] args){ int[] b = new int[10]; f(b); } }
运行结果:
21978*4=87912