奇数魔方阵就是将数字排列在nxn(n为奇数)的方阵上,要求满足各行、各列与各对角线的和相同。如下图所示,是n=5的奇数魔方阵。
填魔方阵的方法以奇数魔方阵最为简单,第一个数字放在第一行的正中央(填了1),然后向右(左)上填,如果右(左)上已有数字,则向下填,如下图所示:
一般程序语言的阵列多由0开始,为了计算方便,我们利用索引1到n的部份,而在计算是向右(左)上或向下时,我们可以将索引值除以n值,如果得到余数为1就向下,否则就往右(左)上。
4N 魔方阵
与奇数魔术方阵相同,在于求各行、各列与各对角线的和相等,不同的是这次方阵的维度是4的倍数。
先来看看4X4方阵的解法:
简单的说,就是一个从左上由1依序开始填,但遇对角线不填,另一个由左上由16开始填,但只填在对角线,再将两个合起来就是解答了。如果N大于等于2,则以 4X4为单位画对角线,如下所示:
至于对角线的位置该如何判断,有两个公式,有兴趣的可以画图印证,如下:
左上至右下:j % 4 == i % 4
右上至左下:(j % 4 + i % 4) == 1
8阶魔方阵(N=2)的结果如下:
魔方阵只能算奇数的。下面这个程序原本是从百度百科里找到的,不过发现百科里面那个程序原来有误,修改后终于可以了,给你,希望有帮助!!!
#include <stdioh>
#define N 16 //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);
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<=nn;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("\n");
}
return 0;
}
我只想说你的算法错了,你还是去查一查魔方阵的算法吧;下面是n阶奇数魔方阵的程序,你好好看看吧:
# include <stdioh>
void main()
{
int array[16][16];
int i, j, k, m, n;
/ 变量初始化 /
m = 1;
while(m == 1)
{
printf("请输入n(0<n<=15),n是奇数)\n");
scanf("%d", &n);
/ 判断n是否是大于0小于等于15的奇数 /
if((n!=0) && (n<=15) && (n%2!=0))
{
printf("矩阵阶数是 %d\n", n);
m = 0;
}
}
/ 数组赋初值为0 /
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
array[i][j] = 0;/ 建立魔方阵 /
j = n/2 + 1;
array[1][j] = 1;
for(k=2; k<=nn; 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(array[i][j] == 0)
array[i][j] = k;
else
{
i = i + 2;
j = j - 1;
array[i][j] = k;
}
}/ 输出魔方阵 /
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
printf("%5d", array[i][j]);
printf("\n");
}
}输入3所得到的三阶魔方阵为:
对,先要了解算法最好
给你个吧,不过是有限阶的(用vc做的)
#include <stdioh>
void main()
{
int i,j,n,k,u,t,m,x,y,a[100][100];
printf("please input n:");
scanf("%d",&n);
printf("\n");
if(n>2&&(n%2)!=0)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=0;
j=(n-1)/2;i=0;
a[i][j]=1;
for(k=2;k<=nn;k++)
{i-=1;j+=1;
if(i<0&&j>n-1)
{i=i+2;j=j-1;}
else
{
if(i<0)i=n-1;
if(j>n-1)j=0;
}
if(a[i][j]!=0)
{ i+=2;j-=1;
a[i][j]=k;
}
else a[i][j]=k;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%-4d",a[i][j]);
printf("\n");
}
}
else if(n>2&&(n%4)==2)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=0;
m=(n-2)/4; //n=4m+2;
u=n/2; //u为子矩阵行数或列数
t=(n+2)/4; //t为A的中间行
j=t-1;i=0;
a[i][j]=1;
for(k=2;k<=uu;k++)
{i-=1;j+=1;
if(i<0&&j>u-1)
{i=i+2;j=j-1;}
else
{
if(i<0)i=u-1;
if(j>u-1)j=0;
}
if(a[i][j]!=0)
{ i+=2;j-=1;
a[i][j]=k;
}
else a[i][j]=k;
}
j=t-1+u;i=u;
a[i][j]=1+uu;
for(k=uu+2;k<=2uu;k++)
{i-=1;j+=1;
if(i<u&&j>u-1+u)
{i=i+2;j=j-1;}
else
{
if(i<u)i=u-1+u;
if(j>u-1+u)j=u;
}
if(a[i][j]!=0)
{ i+=2;j-=1;
a[i][j]=k;
}
else a[i][j]=k;
}
j=t-1+u;i=0;
a[i][j]=1+2uu;
for(k=2uu+2;k<=3uu;k++)
{i-=1;j+=1;
if(i<0&&j>u-1+u)
{i=i+2;j=j-1;}
else
{
if(i<0)i=u-1;
if(j>u-1+u)j=u;
}
if(a[i][j]!=0)
{ i+=2;j-=1;
a[i][j]=k;
}
else a[i][j]=k;
}
j=t-1;i=u;
a[i][j]=1+3uu;
for(k=3uu+2;k<=4uu;k++)
{i-=1;j+=1;
if(i<u&&j>u-1)
{i=i+2;j=j-1;}
else
{
if(i<u)i=u-1+u;
if(j>u-1)j=0;
}
if(a[i][j]!=0)
{ i+=2;j-=1;
a[i][j]=k;
}
else a[i][j]=k;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%-4d",a[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<u;i++)
for(j=0;j<m;j++)
if(i!=t-1)
{y=a[i][j];a[i][j]=a[i+u][j];a[i+u][j]=y;}
x=t-1;
for(j=0;j<m;j++)
{y=a[t-1][x];a[t-1][x]=a[t-1+u][x];a[t-1+u][x]=y;x++;}
for(j=n-1;j>n-1-(m-1);j--)
for(i=0;i<u;i++)
{y=a[i][j];a[i][j]=a[i+u][j];a[i+u][j]=y;}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%-4d",a[i][j]);
printf("\n");
}
}
else if(n>2&&n%4==0)
{
k=1;
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;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%-4d",a[i][j]);
printf("\n");
}
printf("\n");
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("\n");
}
}
else printf("输入错误\n");
system("pause");
}
#include<iostreamh>
#include<conioh>
#include<iomaniph>
void main()
{ int a[20][20];
int k;
int n,i,j;
do{
cout<<"请输入幻方阶数(<=20): ";
cin>>n;}
while(
n>20 || n%2==0 );
i=n/2;j=n-1;a[i][j]=1;
for(k=2;k<=nn;k++)
{if(k%n==1)j=(j-1)%n;
else{i=(i+1)%n;j=(j+1)%n;}
a[i][j]=k;
}
for (i=0;i<n;i++){
for (j=0;j<n;j++) cout<<setw(4)<<a[i][j];
cout<<endl;
}
getch();
}
你用vc++60试运行,运行的结果你验算下,可能具体的不是和你上面的对应,但应该是正确的,不行的话发我邮件 wick_2007@cumteducn
以上就是关于用C语言如何编程打印出由1到n^2的自然数构成的魔方阵,全部的内容,包括:用C语言如何编程打印出由1到n^2的自然数构成的魔方阵,、c语言魔方阵问题!、C语言 三阶魔方阵等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)