C語言幻方矩陣的求解

2021-10-18 22:46:10 字數 2652 閱讀 4898

所謂幻方,就是乙個 n 行 n 列的正方形,當 n 為奇數時,稱為奇數階幻方。共有 n2 個格仔,將 1,2,3,…,n2 這些數字放到這些格仔裡,使其每行的和、每列的和及兩 條對角線的和都是乙個相同的數。試程式設計由鍵盤輸入乙個奇數 n,輸出乙個 n 階幻方;

解題思路:首先我們將主教材的演算法提示按步分解。

(1)定義乙個陣列 a[n][n]來儲存 n 階幻方,這裡 n 為奇數,陣列各元素的初值均為 0,

表示該位置上還沒有填數;

(2)用乙個整型變數 k 來表示當前要賦的數,按題意 k 將開始從 1 到 n2迴圈,因為 n

階幻方將有 n2 個數;

(3)定義整型變數 i,j 表示要賦值的行號和列標,i 初值為 0,j 初值為 n/2,表示第一

個數要放在第一行中間的那個格仔裡;

(4)填數字開始,k 開始迴圈,完成下面的(5)到(10);

(5)先將 k 賦到相應的位置,即將 a[i][j]賦為 k,再將 i,j 的值分別用整型變數 iold

和 jold 暫時儲存,注意是暫時;

(6)將 i 的值減 1,j 的值增 1,表示後乙個數放在這個數的右上格;

(7)如果 i<0 且 j=0,且 j>=n,即右上格從右面超出,則 j=0,表示後一數放到與右上格同

行的第一列;

(9)如果 i<0 且 j>=n,即右上格既從右面超出又從上面超出,則將後一數放在前一數

的下面,即 i=1,j=n-1;

(10)如果 a[i][j]>0,即右上格已被數字填充,則後一數放在前一數的下面,即 i=iold+1,

j=jold。

下列**思路與上述相同(後續優化版本)

#include

#include

intlaobo

(int n,

int*

*arr,

int num)

//勞伯法 用於計算奇數階的情況

else

}return0;

}int

init

(int n,

int*

*arr)

}return0;

}int

haier

(int n,

int*

*arr)

//被4整除時用該函式

}return0;

}int

late

(int n,

int*

*arr)

for(i =

0;i < deg;i++

)for

(j =

0;j < deg;j++

) a[i]

[j]=0;

laobo

(deg, a,

1+deg*deg)

;for

(i =

0;i < deg;i++

)//d象限賦值

for(j =

0;j < deg;j++

)for

(i =

0;i < deg;i++

)for

(j =

0;j < deg;j++

) a[i]

[j]=0;

laobo

(deg, a,1+

2*deg*deg)

;for

(i =

0;i < deg;i++

)//b象限賦值

for(j =

0;j < deg;j++

)for

(i =

0;i < deg;i++

)for

(j =

0;j < deg;j++

) a[i]

[j]=0;

laobo

(deg, a,1+

3*deg*deg)

;for

(i =

0;i < deg;i++

)//c象限賦值

for(j =

0;j < deg;j++

) k =

(n -2)

/4;for

(i =

0;i < deg;i++

)//實現了ac象限前k個數的交換

}for

(j =

0;j < k;j++

)//因為a象限中間行是從中間格開始換的

//所以我們要將前面替換了的前k格給替換回來

//替換中間格開始的k個

for(j = deg/

2;j <

((deg/2)

+ k)

;j++)if

(k !=0)

}free

(a);

return0;

}int

main()

else

if(n %4==

0)else

for(i =

0;i < n;i++

)printf

("\n");

}free

(arr)

;return0;

}

C語言檢驗並列印幻方矩陣

幻方矩陣是指該矩陣中每一行 每一列 每一對角線上的元素之和都是相等的。從鍵盤輸入乙個5 5的矩陣並將其存入乙個二維整型陣列中,檢驗其是否為幻方矩陣,並將其按指定格式顯示到螢幕上。輸入格式 d 輸出格式 如果是幻方矩陣,輸出提示資訊 it is a magic square n 矩陣元素的輸出 4d ...

MATLAB 矩陣與幻方矩陣

關於矩陣 在 matlab 環境中,矩陣是由數字組成的矩形陣列。有時,1 1 矩陣 即標量 和只包含一行或一列的矩陣 即向量 會附加特殊含義。matlab 採用其他方法來儲存數值資料和非數值資料,但剛開始時,通常最好將一切內容都視為矩陣。matlab 旨在盡可能簡化運算。其他程式語言一次只能處理乙個...

840 矩陣中的幻方

3 x 3 的幻方是乙個填充有從 1 到 9的不同數字的 3 x 3 矩陣,其中每行,每列以及兩條對角線上的各數之和都相等。給定乙個由整數組成的grid,其中有多少個 3 3 的 幻方 子矩陣?每個子矩陣都是連續的 示例 輸入 4,3,8,4 9,5,1,9 2,7,6,2 輸出 1解釋 下面的子矩...