前言
對於程序員來說,用程序解決數學問題是最有趣的事情之一。本人研究了一個能夠輕易計算九宮圖的算法,並且用java語言編寫程序得以實現。現將算法和代碼公佈,歡迎廣大程序愛好者前來閱讀、交流。
九宮圖簡介
九宮圖是我國古老的數學問題,也是一種數字藝術,就是把1~9九個數字填到3行3列九個方格中,使其每一橫、堅、斜行之和都等於15。如下圖就是九宮圖:
編程思想
要計算九宮圖,我首先想到的是找數字規律。對於九宮圖而言,以每個邊角數字(如4)爲首位,都能有3組不重複的數字組合的和爲15。例如上圖中以4爲開頭則有4、9、2,和4、3、8和 4、5、6三組數字之和爲15。如果僅要求第一個數字是4,後兩個數字可以顛倒位置,則這樣的數字組合有6種。同理以中央數字爲開頭,在後兩個數字可以顛倒位置的情況下,會有8個數字組合的和爲15。利用這一規律,我們可以輕易得到九宮圖中的4個拐角數字和1箇中央數字,其他數字就可輕易計算出。
算法
1、創建全局的一個數組和一個int型變量分部用來存儲4個邊角數字和1箇中央數字。設置標記數字d=0;
2、利用三層for循環將第一、第二、第三個數字均從1開始累加,到9爲止,中間嵌套if判斷語句保證三個數字不相等。
3、在for循環的最內層計算三個數字之和,如果等於15,則標記數字d自增1,表示已經找到一組和爲15的數字組合。
4、在循環的最外層,也就是第一個數字不變,後面兩個數字取任意不重複值取完之後,利用if語句進行判斷,如果d的值自增到了6,則說明找到了邊角數字,存入數組;如果d的值自增到了8,則說明得到了中央數字,需要賦值存儲。如果d的值自增到了4,說明此時是每一行中間的數字,但是這個數字我們不需要存儲。
5、每次d分別自增到4、6、8時,說明此時內部的兩層循環已經結束,第一個數字即將自增1再重新開始內部的兩層循環,此時需要將d的值重新歸0,以便計算不同的首位數字的到和爲15的數字組合個數。
6、當得到4個邊角數字和1箇中央數字之和,再計算每一行中間的數字就特別簡單了,只需要用15減去兩個就行。
7、所有數字就得到以後,就可以展示出來。
程序代碼
package InterestingProgram ;
public class JiuGongTu {
public static void main(String[] args) {
// TODO Auto-generated method stub
int d=0;
int i=0;
//創建int數組,用來存儲4個邊角數字
int[] corner=new int[4];
//center用來存儲中央的數字
int center = 0;
for(int a=1;a<10;a++){
for(int b=1;b<10;b++){
if(a!=b){
for(int c=1;c<10;c++){
if(a!=c&&b!=c){
int x=a+b+c;
if(x==15){
d++;
}
}
}
}
}
if(d==6){
System.out.println("得到邊角數字是"+a);
corner[i]=a;
i++;
d=0;
}
if(d==4){
d=0;
}
if(d==8){
System.out.println("得到中央數字是"+a);
center=a;
d=0;
}
}
//第一行中間的數字爲
int m1=15-corner[0]-corner[1];
//最後一行中間的數字爲
int m2=15-corner[2]-corner[3];
//左邊列中間的數字爲
int m3=15-corner[0]-corner[2];
//左邊列中間的數字爲
int m4=15-corner[1]-corner[3];
System.out.println("九宮圖如下:");
System.out.println(corner[0]+" "+m1+" "+corner[1]);
System.out.println(m3+" "+center+" "+m4);
System.out.println(corner[2]+" "+m2+" "+corner[3]);
}
}