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

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

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

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

  • 第一行元素之和: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 {
printf("\\n");
for(j=0; 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;
}
/<stdlib.h>/<stdio.h>

趕緊編程實現一下吧,

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


分享到:


相關文章: