魔方陣(4k)
阿新 • • 發佈:2018-12-31
魔方陣 :n=4k(n=4,8,12,16... k=1,2,3,4..)
一、規律
(1)把1到n^2這些數字按照順序填寫到n*n格子中,按 4*4把它分割成k*k個小方陣。
(因為n是4的倍數,所以一定能用4*4個小方陣分割)
(2) 將各個對角線上的數字,換成與它互補的數字。
(互補:最大數字與最小數字的和,即n*n+1)
二、填數過程(以8*8方陣為例)
① 把1到8^2=64這些數字按照順序填寫到8*8格子中,按 4*4把它分割成2*2個小方陣。
② 將各個對角線上的數字,換成與它互補的數字。
(1-----64)
(10----55)
(19---46)
(28---37)
三、程式部分說明
a、在小正方形的4*4中尋找右下方向對角線第一個元素,觀察規律,發現 行%4==0,並且 (行-列)%4==0
對角線元素取其互補數 行+1 列+1 往右下方向遍歷
b、在小正方形的4*4中尋找右上方向對角線第一個元素,觀察規律,發現 行%4==3,並且 (行+列 %4==3
對角線元素取其互補數 行-1 列+1 往右上方向遍歷
四、程式編寫如下:
[cpp] view plain copy
- #include<stdio.h>
- #include<math.h>
- #include<assert.h>
- void Even4kMagicSquare(int n)
- {
- assert(n % 4 == 0);//保證是4的倍數
- int a[100][100];
- int num = 1;
- for (int i = 0; i < n; i++)//從1到n的平方依次賦值
- {
- for (int j = 0; j < n; j++)
- {
- a[i][j] = num;
- num++;
- }
- }
- for (int i = 0; i < n; i++)//小正方形的對角線上的數字取其補數
- {
- for (int j = 0; j < n; j++)
- {
- if (i % 4 == 0 && abs(i - j) % 4 == 0)//右下對角線(0,0)(0,4)(4,0)(4,4)...
- {
- for (int k = 0; k < 4; k++)//abs為整型絕對值函式
- {
- a[i + k][j + k] = abs(n*n + 1 - a[i + k][j + k]);
- }
- }
- if (i % 4 == 3 && (i + j) % 4 == 3)//右上方向對角線(3,0)(3,4)(7,0)(7,4)...
- {
- for (int k = 0; k < 4; k++)
- {
- a[i - k][j + k] = abs(n*n + 1 - a[i - k][j + k]);
- }
- }
- }
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- printf("%-5d", a[i][j]);
- }
- printf("\n\n");
- }
- }
- int main()
- {
- Even4kMagicSquare(8);
- return 0;
- }
執行結果: