当前位置:编程学习 > C/C++ >>

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

追问:感谢你的答案,但你的程序是不是只能算到15呀?我想要能算到n阶的,请高手赐教
答案:#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;
 }
其他:#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");
    }
 }
 .初始化 
创建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; 
}

上一个:7)C语句: int (* pa)[5]; 中,pa 表示的是一个( )
下一个:13)在C语言中,对变量的访问方式是( )

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,