谁帮忙解释下这个C程序

来源:百度知道 编辑:UC知道 时间:2024/05/12 05:54:10
/* HELLO.C -- Hello, world */

#include "stdio.h"
#include "conio.h"
#include "math.h"
main()
{
int a[16][16],i,j,k,p,n;
p=1;
while(p==1)
{printf("enter n(n=1 to 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

看了一下运行结果,最后得到的是九宫图:
比如选n=3,
则最后结果为
8 1 6
3 5 7
4 9 2
每行每列和对角线加起来都为15.(传说中的龟背洛图)
选n=5,
则结果为
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
每行每列和对角线都为65.

下面我们讨论程序。
1:如果输入负数的奇数,则程序不能运行如-3,-5.
2:a数组的第一行第一列永远都没有访问,为什么不从a[0][0]开始赋值而是从a[1][1]开始。虽然方便了,但是从编程角度来说是不可取的,显然是个数学家编的,不是搞编程的人做的。
3:假定n=3,程序流程先给第一排中间赋值1,然后
整个程序的关键循环:for(k=2;k<=n*n;k++){ }。这个算法显然经过改进的,输入数据的顺序就是2,3,4,5,6,7,8,9,具体为什么可以需要这样,需要去看具体的数学模型。这已经脱离了语言的范畴。
估计没人想看这种问题。

这个hello world好特殊...

杀了我先