福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE * ? = EDCBA
他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把 ABCDE 所代表的数字写出来。
解析:ABCDE代表不同的数字,问号也代表某个数字,所以说ABCDE和?分别都是来自数字0~9的数字,可以用全排列的算法
代码如下:(耗时20ms左右)
public class 古堡探险
{
private static long Begin; //与本题无关,只是用来计算耗时的
private static long Last; //与本题无关,只是用来计算耗时的
public static int GetNum1(int[] c,int x,int y) //计算ABCDE五位数字组成的一位数字
{
int sum = 0;
for(int i=x;i<=y;++i)
{
sum = sum*10 + c[i];
}
return sum;
}
public static int GetNum2(int[] c,int x,int y) //计算EDCBA五位数字组成的一位数字
{
int sum = 0;
for(int i=x;i>=y;--i)
{
sum = sum*10+c[i];
}
return sum;
}
public static void Swap(int[] c,int i,int j)
{
int tmp = c[i];
c[i] = c[j];
c[j] = tmp;
}
public static void AllPermutation(int[] c,int start) //全排列算法
{
if(start==c.length-1)
{
int A = GetNum1(c,0,4); //用前五位数代表ABCDE
int B = c[5]; //代表?
int C = GetNum2(c,4,0); //用前五位数的逆序代表EDCBA
if(A*B==C)
{
Last = System.currentTimeMillis()- Begin; //与本题无关,只是用来计算耗时的
System.out.println(A); //输出ABCDE
System.out.println("耗时:"+Last+"ms"); //与本题无关,只是用来计算耗时的
System.exit(0); //退出Java虚拟机
}
}
else
{
for(int i=start,t=c.length;i<t;++i)
{
Swap(c,i,start);
AllPermutation(c,start+1);
Swap(c,start,i);
}
}
}
public static void main(String[] args)
{
Begin = System.currentTimeMillis(); //与本题无关,只是用来计算耗时的
int[] c = {0,1,2,3,4,5,6,7,8,9}; //全排列算法
AllPermutation(c,0);
}
}
运行结果:
21978
耗时:16ms