輸入乙個奇數n,構造並輸出乙個n階等和幻方

2021-05-08 10:18:29 字數 1463 閱讀 5743

輸入乙個奇數n,構造並輸出乙個n階等和幻方,

即每一行每一列和兩對角線上的n個數的和相等

如當n=9時,有:

47 58 69 80  1 12 23 34 45

57 68 79  9 11 22 33 44 46

67 78  8 10 21 32 43 54 56

77  7 18 20 31 42 53 55 66

6 17 19 30 41 52 63 65 76

16 27 29 40 51 62 64 75  5

26 28 39 50 61 72 74  4 15

36 38 49 60 71 73  3 14 25

37 48 59 70 81  2 13 24 35

********************===

題目分析:

先搜尋到奇數幻方的構造方法:

(1) 將1放在第一行中間一列;

(2) 從2開始直到n×n止各數依次按下列規則存放:

下乙個數字於前乙個數的右邊的上方

即乙個數的座標比前乙個數的行數-1,列數+1 .

(3) 如果行列範圍超出矩陣範圍,則迴繞.

即當前數字於第n列,則下乙個數字於第一列(列數+1).

例如1在第1行,則2應放在最後一行(行數-1),列數同樣加1;

(4) 如果按上面規則確定的位置上已有數,則把下乙個數放在上乙個數的下面

. 成

將n*n的幻方實現為n*n的二維陣列,由於n需要變動,所以使用動態二維陣列.

int n是n階幻方的邊長,int i,j作為臨時變數來訪問陣列.

生成好二維陣列以後,**:

用於填充幻方,便於接下來的位置檢測.

接著int row, col作為當前行,當前列.int nrow, ncol作為下一數所在行,下一數所在列.

根據幻方填充規則得知,1總是位於第0行,第(n-1)/2列.

根據幻方規則,接下來的填充一次從2,3一直到n*n(例子中n*n=25)

所以設定乙個迴圈,即for(i=1;i為當前i尋找填充座標 "

所以,迴圈體為將當前行-1,當前列+1,得到的新座標作為下乙個填充目標.

如果當前行-1小於第一行,那麼新座標的行數將從倒數第一行算起,列同理.

這樣將得到新的填充座標,但是,根據幻方填充規則:如果接下來要填充的位置上已有數,則把接下來要填充的位置更改為上乙個數的下面 .

所以,接下來進入乙個迴圈,終止條件就是找到乙個目標座標,它的值為0(因為已填充數都是不為0,如果當前目標已為0,則跳過本迴圈)

因為"把接下來要填充的位置更改為上乙個數的下面

",由於此時的目標座標已經改為"上乙個數的右邊的上面",所以"上乙個數的下面"對於

"上乙個數的右邊的上面"來說就是位於它的"下面的下面的左邊",即nrow+2,ncol-1.同樣要判斷是否到達邊界.

最後將當前i值賦予當前目標.

輸入乙個正整數n,輸出n 的值。

輸入乙個正整數 n nn 輸出 n n n 的值。其中n 1 2 3 nn 1 2 3 cdots n n 1 2 3 n演算法描述 n n n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列 a aa 來表示乙個大整數 a aa a 0 a 0 a 0 表示 a a...

輸入乙個正數 n,輸出所有和為 n 連續正數序列。

1 輸入乙個正數 n,輸出所有和為 n 連續正數序列 例如輸入 15,由於 1 2 3 4 5 4 5 6 7 8 15,所以輸出 3 個連續序列 1 5 4 6 和 7 8。分析 我們用兩個數small和big分別表示序列的最小值和最大值。首先把small初始化為 1,big初始化為 2。如果從s...

藍橋杯題目 輸入乙個正整數n,輸出n 的值。

問題描述 輸入乙個正整數n,輸出n 的值。其中n 1 2 3 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數k變為將陣列a的每乙個元素都乘以k,請注意處理相...