下面是一个打印奇数阶魔方阵的程序:
#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=0p<np++)
{for(q=0q<nq++)
{if(q>0)
{i=(i+n-1)%n
j=(j+1)%n
}
a[i][j]=k++
}
i=(i+1)%n
}
for(i=0i<ni++)
{for(j=0j<nj++)
printf("%4d",a[i][j])
printf("\n")
}
return 0
}
程序代码:
#include&ltstdio.h&gt
#define N 16
int main()
{
int a[N][N]={0},i,j,k,p,n
p=1
while(p==1)
{
printf("Enter n(1~%d):",N)
scanf("%d",&n)
if((n!=0)&&(n&ltN)&&(n%2!=0))
p=0
}
i=n+1
j=n/2+1
a[1][j]=1
for(k=2k&lt=n*nk++)
{
i=i-1
j=j+1
if((i&lt1)&&(j&gtn))
{
i=i+2
j=j-1
}
else
{
if(i&lt1)i=n
if(j&gtn)j=1
}
if(a&lti&gt[j]==0)a&lti&gt[j]=k
else
{
i=i+2
j=j-1
a&lti&gt[j]=k
}
}
for(i=1i&lt=ni++)
{
for(j=1j&lt=nj++)
printf("%4d",a&lti&gt[j])
printf("\n")
}
return 0
}
扩展资料:1.第一行中间一列的值为1。
所以用j=n/2+1确定1的列数,得出a[1][j]=1。
行数用i=i-1确定,列数用j=j+1确定。
3.如果一个数行数为第一行,则下一个数行数为最后一行。
4.如果一个列行数为最后一列,则下一个数列数为第一列。
5.如果按上面的规则确定的位置上已有数,或上一个数是第一行最后一列,则把下一个数放在上一个数的下面。
这个是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=0i<xi++)
{
for(j=0j<xj++)
{
k+=1
a[i][j]=k
}
}
for(i=0i<xi++)
for(j=0j<xj++)
{
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=2k<=x*xk++)
{
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=0i<xi++)
{
for(j=0j<xj++)
printf("%4d",a[i][j])
printf("\n")
}
}
}