高級玩家x · 程式 ·

C語言——你知道魔方陣麼?

所謂,魔方陣,就是一個n*n階的矩陣,他的每列的元素的和相等,每列的元素的和也相等,並且對角線的元素的和也相等。

例如下面就是一個5階的魔方矩陣:

  • 第一行元素之和:17+24+1+8+15=65
  • 第一列元素之和:17+23+4+10+11=65
  • 主對角線上元素之和:17+5+13+21+9=65

歐克,那我們來看看怎麼實現的吧:

假定陣列的行列下標都從0開始,則魔方陣的生成方法為:在第0行中間置1,對從2開始的其餘n2-1個數依次按下列規則存放:

(1) 假定當前數的下標為(i,j),則下一個數的放置位置為當前位置的右上方,即下標為(i-1,j+1)的位置。

(2) 如果當前數在第0行,即i-1小於0,則將下一個數放在最後一行的下一列上,即下標為(n-1,j+1)的位置。

(3) 如果當前數在最後一列上,即j+1大於n-1,則將下一個數放在上一行的第一列上,即下標為(i-1,0)的位置。

(4) 如果當前數是n的倍數,則將下一個數直接放在當前位置的正下方,即下標為(i+1,j)的位置。

過程就是著呢個過程,方法怎麼設計,代碼怎麼寫就看你們的了:

參考代碼:

#include<stdio.h>#include<stdlib.h>int array(int n){ int i, j, no, num, max; int *mtrx; if(n%2 == 0) /*n是偶數,則加1使其變為奇數*/ { n=n+1; } max=n*n; mtrx=(int *)malloc(max+max); /*為魔方陣分配內存*/ mtrx[n/2]=1; /* 將1存入數組*/ i=0; /*自然數1所在行*/ j=n/2; /*自然數1所在列*/ /*從2開始確定每個數的存放位置*/ for(num=2; num<=max; num++) { i=i-1; j=j+1; if((num-1)%n == 0) /*當前數是n的倍數*/ { i=i+2; j=j-1; } if(i<0) /*當前數在第0行*/ { i=n-1; } if(j>n-1) /*當前數在最後一列,即n-1列*/ { j=0; } no=i*n+j; /*找到當前數在數組中的存放位置*/ mtrx[no]=num; } /*列印生成的魔方陣*/ printf("生成的%d-魔方陣為:",n); no=0; for(i=0; i<n; i++) { printf("\n"); for(j=0; j<n; j++) { printf("%3d", mtrx[no]); no++; } } printf("\n"); free(mtrx); return 0;}int main(){ int n; printf("請輸入n值:\n"); scanf("%d", &n); array(n); /*調用array函數*/ return 0;}

趕緊編程實現一下吧,

有什麼問題歡迎留言討論哦,

如果您喜歡,歡迎點一下關注呦。

聲明:文章觀點僅代表作者本人,PTTZH僅提供信息發布平台存儲空間服務。
喔!快樂的時光竟然這麼快就過⋯