福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE * ? = EDCBA
他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把 ABCDE 所代表的数字写出来。
答案写在“解答.txt”中,不要写在这里!
分析:判断重复用set,拆分数字除了转化成字符串处理之外,合理利用除法取余运算也是不错的选择
public static void main(String[] args) {
int a,b,c,d,e;
for(int i = 10000;i<=99999;i++) {
st.clear();
a = i/10000; st.add(a);
b = i%10000/1000;st.add(b);
c = i%1000/100;st.add(c);
d = i%100/10;st.add(d);
e = i%10;st.add(e);
// a = i/10000; st.add(a);
// b = i/1000%10;st.add(b);
// c = i/100%10;st.add(c);
// d = i/10%10;st.add(d);
// e = i%10;st.add(e);
if(st.size()==5) {
int sum = e*10000+d*1000+c*100+b*10+a;
for(int j = 1;j <= 9;j++)
if(i*j==sum) {
System.out.println(i);
break;
}
}
}
}
补:搜索解法,最近在练习搜索
import java.util.*; public class Main { static Scanner in = new Scanner(System.in); static char[] c = new char[15]; static int[] a = new int[15]; static boolean[] vis = new boolean[10]; static Set st = new HashSet<Integer>(); static void dfs(int sp){ if(sp>=5) { st.clear(); for(int i = 0;i < 5;i++) st.add(a[i]); // int sum1= a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4]; // System.out.println(sum1); if(st.size()==5) { int sum1= a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4]; int sum2= a[4]*10000+a[3]*1000+a[2]*100+a[1]*10+a[0]; for(int i = 1;i <= 9;i++) { if(sum1*i==sum2) System.out.println(sum1); } } return ; } for(int i = 0;i <= 9;i++) { if(!vis[i]) { vis[i] = true; a[sp] = i; dfs(sp+1); vis[i] = false; } } } public static void main(String[] args) { Arrays.fill(vis, false); dfs(0); } }