福爾摩斯到某古堡探險,看到門上寫着一個奇怪的算式:
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