觀察下面的加法算式:
祥瑞生輝
+ 三羊獻瑞
----------------------
三羊生瑞氣
(如果有對齊問題,可以參看【圖1.jpg】)
其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。
請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多餘內容。
答案:1 0 8 5
解析:這個題看起來有點嚇人,但是隻要認真審題,做起來就沒有那麼難了,祥瑞生輝代表四個數字組成的一個整數,三羊獻瑞代表四個數字組成的一個整數,並且不同的漢字代表不同的數字,祥瑞生輝和三羊獻瑞共有一個字(數字)是相同的,四位數+四位數生成了一個五位數,說明三一定是進位1,所以可以確定的是三一定是1,羊、生、瑞、氣都是兩個加數裏面的數,所以這個題不用暴力破解也能解決,可以用全排列的方法來做。先定義一個int類型的數組(c[10]),數組c的初始化方式爲:
上圖中的數字是數組的下標所對應的漢字(及數字),根據上圖下標初始化數組c = {1,0,2,3,4,5,6,7,8,9},c[0]最好等於1,這樣可以減少時間複雜度,然後進行全排列的算法,以1開頭(即c[0]=1)先把c[5]記錄下來(即int=c[5]),根據題目要有瑞字有兩個,所以讓c[5] = c[3],然後計算祥瑞生輝、三羊獻瑞、三羊生瑞氣若組成的三個數:
int A = c[0]*1000+c[1]*100+c[2]*10+c[3];
int B = c[4]*1000+c[5]*100+c[6]*10+c[7];
int C = c[0]*10000+c[1]*1000+c[6]*100+c[3]*10+c[8];
若A+B=C則輸出c[0],c[1],c[2],c[3]。
代碼如下:
public class 三羊獻瑞
{
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)
{
if(c[0]==1) //因爲羊一定代表1,所以只需判斷以1開頭的排列即可
{
int tmp = c[5]; //先記錄下c[5],因爲全排列中的數字必須是分別且只出現一次
c[5] = c[3]; //應爲有兩個瑞字,所以有兩個重複數字
int A = c[0]*1000+c[1]*100+c[2]*10+c[3]; //三羊獻瑞
int B = c[4]*1000+c[5]*100+c[6]*10+c[7]; //祥瑞生輝
int C = c[0]*10000+c[1]*1000+c[6]*100+c[3]*10+c[8]; //三羊生瑞氣
if(A+B==C)
{
System.out.println(c[0]+" "+c[1]+" "+c[2]+" "+c[3]); //輸出三羊獻瑞
System.exit(0); //退出虛擬機
}
c[5] = tmp; //保證全排列數組中的數分別且只出現一次
}
else //只判斷以1開頭,其他則不符合要求
{
System.exit(0); //退出虛擬機
}
}
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)
{
int[] c = {1,0,2,3,4,5,6,7,8,9}; //1代表羊
AllPermutation(c,0); //全排列算法
}
}
運行結果:
1 0 8 5