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