用C语言如何编程打印出由1到n^2的自然数构成的魔方阵,

用C语言如何编程打印出由1到n^2的自然数构成的魔方阵,,第1张

奇数魔方阵就是将数字排列在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语言 三阶魔方阵等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9320157.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存