用C语言编程打印出由1到n^2的自然数构成的魔方阵,n由键盘输入。魔方阵的每一行每一列和对角线均相等。

如题所述

.初始化
创建n*n方阵(n为奇数), 并以0填充
以整数h表示方阵列, v表示方阵行
h = n-1
v = n/2
.初始化完毕

.定义
当前: 当前方阵行列位置(v, h)
下一: 下一方阵行列位置(v+1, h+1)
.定义完毕

.开始
1. 判断: 数是否填完
是: 结束
否: 当前: 填数
2. 判断: 下一 是否越界
是: 下一: 越界坐标置0
否: 继续
3. 判断: 下一 是否为0
是: 当前 = 下一, 转1
否: 当前: h减1, v不变, 转1
.结束

#include <stdio.h>
#include <stdlib.h>

/*----------------------------------------*/
struct stPOS {
int h;
int v;
}
cur, next;
/*--定义方阵行列表示方法:h表示列,v表示行--*/

int main()
{
int *piNumber;
int iSIZE, i, j;

/*-----------定义变量--------------*/

do {
printf( "输入n*n方阵大小(必须为奇数,输入-1退出): ");
scanf( "%d ", &iSIZE);
if (iSIZE == -1) exit(0);
if (!(iSIZE % 2))
printf( "\n错误,应该输入奇数\n ");
}
while (!(iSIZE % 2));
/*--------------------------------*/

if ((piNumber = (int *)malloc(iSIZE * iSIZE * sizeof(int))) == NULL) {
printf( "内存分配错误!\n ");
exit(1);
}

cur.h = iSIZE - 1;
cur.v = iSIZE / 2;
j = iSIZE * iSIZE;

for (i = 0; i < j; i++)
*(piNumber + i) = 0;

/*--------------初始化------------*/

for (i = 1; i <= j; ++i) {
*(piNumber + (iSIZE * cur.v) + cur.h) = i;
next.h = cur.h + 1;
next.v = cur.v + 1;
if (next.h == iSIZE) next.h = 0; /*判断: 下一 是否越界*/
if (next.v == iSIZE) next.v = 0;

if (*(piNumber + (iSIZE*next.v) + next.h) == 0) /*判断: 下一 是否为0*/
cur = next;
else
cur.h--;
}
/*-------------处理模块-----------*/

for (i = 0; i < j; ++i) {
if ( i%iSIZE == 0)
printf( "\n ");?

printf( "%d\t ", *(piNumber + i));
}

/*-------------打印结果-----------*/

free(piNumber);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-18
#include <stdio.h>
int main()
{ int a[15][15],i,j,k,p,n;
p=1;
while(p==1)
{printf("enter n(n=1--15):");
scanf("%d",&n);
if ((n!=0) && (n<=15) && (n%2!=0))
p=0;
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
a[i][j]=0;
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("%5d",a[i][j]);
printf("\n");
}
return 0;
}追问

感谢你的答案,但你的程序是不是只能算到15呀?我想要能算到n阶的,请高手赐教

本回答被提问者采纳
第2个回答  2011-05-18
#include"stdio.h"
main()
{
int a[20][20],i,j,k,p=1,m,n;
while(p==1)
{
printf("Enter n(n=1--19):");
scanf("%d",&n);
if(n>0&&n<=19&&n%2!=0)p=0;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
i-=1;
j+=1;
if(i<1&&j>n)
{
i+=2;
j-=1;
}
else
{
if(i<1)i=n;
if(j>n)j=1;
}
if(a[i][j]==0)a[i][j]=k;
else
{
i+=2;
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\n");
}
}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网