『壹』 c語言中魔方陣編程的思路
/*
所謂魔方陣是指這樣的的方陣:
它的每一行、每一列和對角線之和均相等。
輸入n,要求列印由自然數1到n2的自然數構成的魔方陣(n為奇數)。
例如,當n=3時,魔方陣為:
8 1 6
3 5 7
4 9 2
魔方陣中各數排列規律為:
① 將「1」放在第一行的中間一列;
② 從「2」開始直到n×n為止的各數依次按下列規則存放:每一個數存放的行比前一個數的行數減1,列數同樣加1;
③ 如果上一數的行數為1,則下一個數的行數為n(最下一行),如在3×3 方陣中,1在第1行,則2應放在第3行第3列。
④ 當上一個數的列數為n時,下一個數的列數應為1,行數減1。如2在第3行第3列,3應在第2行第1列。
⑤如果按上面規則確定的位置上已有數,或上一個數是第1行第n列時,則把下一個數放在上一個數的下面。
如按上面的規定,4應放在第1行第2列,但該位置已被1占據,所以4就放在3的下面。由於6是第1行第3列(即最後一列),故7放在6下面。
*/
#include"stdio.h"
void main()
{
int i,n=5;
printf("---------------列印魔方陣-------------\n\n");
int a[5][5];
for( i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=0;//初始化
i=0;
int j=n/2;
int t=1;
int si=0;
int sj=0;//記錄上一個數的位置
while(t<=n*n)
{
//printf("\n%4d\n\n",t);
if(a[i][j]==0)
a[i][j]=t;
else
{
if(si==0 && sj==n-1)
{
a[si+1][sj]=t;
i=si+1;
j=sj;
}
if(si!=n-1)
{
a[si+1][sj]=t;
i=si+1;
j=sj;
}
if(si==n-1)
{
a[0][sj]=t;
i=0;
j=sj;
}
}
si=i;
sj=j;
/*計算下一個元素的位置*/
if(i==0)
i=n-1;
else
i=i-1;
if(j==n-1)
j=0;
else
j=j+1;
t=t+1;
}
for(i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n\n");
}
}
『貳』 C語言關於列印n階魔方陣的編程有幾個看不懂的,,求指點啊
在討論關於C語言列印n階魔方陣的編程時,可能有幾個步驟或概念讓人感到困惑。首先,讓我們先理解魔方陣是什麼。魔方陣是一種正方形的數字排列,其中每一行、每一列以及對角線上的數字之和均相等。在構造n階魔方陣時,首先要明確的是n階表示正方形的邊長為n。
第一步,確定n的奇偶性。這是構造不同類型的魔方陣的關鍵。通常情況下,n階魔方陣可以分為奇數階、雙偶階(n為偶數且能被4整除)和偶數階(n為偶數但不能被4整除)三種情況。每種情況的構造方法都有所不同,因此首先要判斷n的性質。
第二步,對於奇數階的魔方陣,可以通過一個通用演算法來生成。這個演算法通常涉及從數組的中間位置開始,然後按一定的規則移動填充數字,確保每一行、每一列和對角線的和相等。這個過程需要一個循環來控制填充的順序和位置。
第三步,對於雙偶階的魔方陣,構造方法類似於奇數階,但需要額外的技巧來確保對角線和其餘行、列的和相等。一種常見的方法是先構造出一個基本的魔方陣,然後通過適當的位移操作來調整對角線的元素。
第四步,對於偶數階的魔方陣,構造則更為復雜,通常需要特殊的演算法來確保所有行、列和對角線的和相等。這類構造方法往往涉及到更精細的元素排列和交換操作。
第五步,在編程實現時,需要利用循環來遍歷數組並填充數字。例如,當p==1時表示循環條件為真,即一直循環直到p變成0。這通常用於控制循環的次數或判斷某個特定條件是否滿足。
總結以上步驟,實現C語言列印n階魔方陣的關鍵在於正確判斷n的性質,選擇合適的構造演算法,並正確使用循環控制填充過程。理解並掌握這些基本概念和步驟將有助於解決編程過程中可能遇到的疑惑。