奇數魔方陣c語言
㈠ 用c語言怎麼打出奇數階的魔方陣
#include<stdio.h>
#defineN5
voidmain()
{
ints[N][N],a,b,i;
for(a=0,b=(N/2),i=2,s[a][b]=1;i<=N*N;i++)
{
if(s[a][b]%N==0)
a++;
else
{
if(a-1<0)a=N-1;
elsea--;
if(b+1==N)b=0;
elseb++;
}
s[a][b]=i;
}
for(a=0;a<N;a++)
{for(b=0;b<N;b++)<br>printf("%-4d",s[a][b]);<br>printf(" ");}
}
㈡ C語言做的魔方陣
下面是一個列印奇數階魔方陣的程序:
#include<stdio.h>
int main()
{int n=0,i,j,k=1,p,q,a[20][20]={0};
while(!(n%2))
{printf("請輸入一個小於20的奇數:");
scanf("%d",&n);
}
i=0;
j=n/2;
for(p=0;p<n;p++)
{for(q=0;q<n;q++)
{if(q>0)
{i=(i+n-1)%n;
j=(j+1)%n;
}
a[i][j]=k++;
}
i=(i+1)%n;
}
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf(" ");
}
return 0;
}

㈢ 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語言魔方陣的演算法原理
這個只能實現奇價的: 
演算法: 
魔方陣的排列規律(奇數陣): 
⑴將1放在第一行中間一列。 
⑵從2開始直到n×n止各數依次按下列規則存放:每一個數存放的行比前一個數的行數減1,列數加1。 
⑶如果上一個數的行數為1,則下一個數的行數為n,列數加1。如果上一個數的列數的n時,下一個數的列數為1,行數減1。 
⑷如果按上面的規則確定的位置上已有數,或上一個數是第一行第n列時,則把下一個數放在上一個數的下面。
㈤ 魔方陣的C語言
代碼一:
#include <stdio.h>
#define N 16 //這里可以修改N的值,並且N只能為偶數
int main()
{
int a[N][N]={0},i,j,k,p,m,n;
p=1;
while(p==1)
{
printf(Enter n(1~%d): ,N-1);/*可以輸入小於等於N-1的奇數*/
scanf(%d,&n);
if((n!=0)&&(n<N)&&(n%2!=0)) p=0;
}
i=n+1;
j=n/2+1; /*建立魔方陣*/
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<1)&&(j>n))
{
i=i+2;j=j-1;
}
else
{
if(i<1) i=n;
if(j>n) j=1;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++)/*輸出魔方陣*/
{
for(j=1;j<=n;j++)
printf(%4d,a[i][j]);
printf(
);
}
}
代碼二:(相對於代碼一條理更清晰,更簡單、更容易理解)
將1~n的平方這幾個數構成一個n階魔方陣。
演算法:
依以下法則,你可以很快的寫出奇數階幻方!當然,這種寫法只是其中一個答案,而不是唯一答案。
1)將1填入第一行中間;
2)將每個數填在前一個數的右上方。
3)若該位置超出最上行,則改填在最下行的對應位置;
4)若該位置超出最右列,則該填在最左列的對應行位置;
5)若某元素填在第一行最右列,下一個數填在該數同列的下一行;
6)若某數已填好,但其右上角已填了其他數據,則下一個數填在該數同列的下一行位置。
#include<stdio.h>
void main()
{
int a[15][15]={0},i,j,m,n,temp,M;
printf(請輸入一個3~15的奇數:
);
scanf(%d,&M);
i=0;
j=M/2;
a[i][j]=1;
for(temp=2;temp<=M*M;temp++)
{
m=i;
n=j;
i--;
j++;
if(i<0)
i=M-1;
if(j>M-1)
j=0;
if(a[i][j]!=0)
{
i=m+1,j=n;
a[i][j]=temp;
continue;
}
a[i][j]=temp;
}
printf(%d×%d魔方陣:
,M,M);
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
printf(%4d,a[i][j]);
printf(
);
}
}
//(求4的倍數階幻方)
void main()
{
int i,j,x,y,n,t,k=1;
int a[100][100];
printf(請輸入魔方陣的階數n 
);
scanf(%d,&n);
printf(輸出為:
);
if(n%4==0)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
a[i][j]=k;
k++;
}
x=n-1;
for(j=0;j<n/2;j++,x--)
{
for(i=0;i<n;i++)
if(i%4!=j%4&&(i+j)%4!=3)
{
t=a[i][j];
a[i][j]=a[i][x];
a[i][x]=t;
}
}
x=n-1;
for(i=0;i<n/2;i++,x--)
{
for(j=0;j<n;j++)
if(i%4!=j%4&&(i+j)%4!=3)
{
t=a[i][j];
a[i][j]=a[x][j];
a[x][j]=t;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf(%-4d,a[i][j]);
printf(
);
}
}
else printf(輸入錯誤
);
system(pause...);
}

㈥ c語言魔方陣問題
#include<stdio.h>
intmain()
{
inta[20][20]={0},i,j,n;
i=1;
printf("請輸入一個數");
scanf("%d",&n);//輸入魔方陣的維度n
j=n/2+1;//j是維度的一半加1.
a[i][j]=1;//確定第一排的中間一個數為1
for(intk=2;k<=n*n;k++)//已經確定1的位置了,再循環確定2~n*n的位置
{
i=i-1;//挪位,豎排往上挪一位。
j=j+1;//挪位,橫排往右挪一位。
if((i<=0)&&(j<=n))//如果豎排挪到頂,同時橫排還沒有超過最右,豎排就到從最下再繼續。
i=n;
if((i<=0)&&(j>n))//如果豎排挪到頂,同時橫排超過最右,豎排往下挪兩位,橫排往左移一位。
{
i=i+2;
j=j-1;
}
if(j>n)//如果只有橫排超過最右,橫排挪到左邊第二行。
{
j=1;
}
if(a[i][j]==0)a[i][j]=k;//如果這個位置還沒有賦值,那麼賦值為k。
else//已經賦值過了。那麼豎排往下挪兩位,橫排往左移一位,再賦值為k。
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++)//循環輸出位置。
{
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf(" ");
}
}
魔方陣有一定畫法,先取一點,然後往左上、右下、右上、左下,任意選一個方向填數字就可以了。
這個是其中一個畫法:
1)將1填入第一行中間;
2)將每個數填在前一個數的右上方。
3)若該位置超出最上行,則改填在最下行的對應位置;
4)若該位置超出最右列,則該填在最左列的對應行位置;
5)若某元素填在第一行最右列,下一個數填在該數同列的下一行;
6)若某數已填好,但其右上角已填了其他數據,則下一個數填在該數同列的下一行位置。
㈦ 用C語言如何編程列印出由1到n^2的自然數構成的魔方陣,
奇數魔方陣就是將數字排列在nxn(n為奇數)的方陣上,要求滿足各行、各列與各對角線的和相同。如下圖所示,是n=5的奇數魔方陣。

一般程序語言的陣列多由0開始,為了計算方便,我們利用索引1到n的部份,而在計算是向右(左)上或向下時,我們可以將索引值除以n值,如果得到余數為1就向下,否則就往右(左)上。
㈧ 用C語言輸出「魔方陣」
這個是17以內奇數階和四階的!!!
#include<stdio.h>
void main()
{
	int x,i,j,fl,k=0,a[18][18]={0};
	printf("請輸入層數:");
	scanf("%d",&x);
	if((x!=4)&&(x%2==0)||(x<0)&&(x>18))
		fl=0;
	else if(x==4)
	{
		for(i=0;i<x;i++)
		{
			for(j=0;j<x;j++)
			{	
				k+=1;
				a[i][j]=k;
			}
		}
		for(i=0;i<x;i++)
			for(j=0;j<x;j++)
			{
				if(((i==j)&&(i<2))||((j==x-i-1)&&(j>2)))
				{
					k=a[i][j];a[i][j]=a[x-i-1][x-j-1];a[x-i-1][x-j-1]=k;
				}
			}
	}
	else
	{
		i=0;
		j=x/2;
		a[0][j]=1;
		for(k=2;k<=x*x;k++)
		{
			i=i-1;
			j=j+1;
			if(i<0&&j>x-1)
			{
				i=i+1;
				j=j-1;
			}
			else
			{
				if(i<0)i=x-1;
				if(j>x-1)j=0;
			}
			if(a[i][j]==0)
				a[i][j]=k;
			else
			{
				i=i+2;
				j=j-1;
				a[i][j]=k;
			}
		}
	}
	if(fl==0)
		printf("無此魔方陣!\n");
	else
	{
		for(i=0;i<x;i++)
		{
			for(j=0;j<x;j++)
				printf("%4d",a[i][j]);
			printf("\n");
		}
	}
}
