今天C语言上机课,真的要被难哭了,呜呜,不过只要自己用心去钻研一道题的话,还是可以有所收获的;
/*今天要求做一道魔方阵(幻方阵)的题,完全没有思路,把它留到了最后,最后实在没办法,看了老师所发放的答案,开始真的就是连答案也看不懂啊,不过,遇到困难就要直面困难,我就一行一行地写注释,终于慢慢理解了这道题,理解后发现其实真的不是很难,感觉自己现在做C语言的题,就好像没有在心底把它重视起来,看两眼题就开始直接下手了,完全没有在大脑中思考一下这是一个非常不好的学习习惯;好了,下面就让我为自己再讲一遍这道题:
1.幻方阵又称魔方阵,是将1~n×n的整数放置在1个n×n的方阵中(n的值为奇数),且保证每行、每列及主对角线、副对角线上的数值之和相等。
本题要求实现n-幻方阵(阶数最大为15),n的值从键盘读入。 N为奇数时,N幻方构造算法为:
(1) 将1放在第一行中间一列;
(2)从2开始直到n×n为止各数依次按下列规则存放:按右上方向行走,即每一个数存放的行比前一个数的行数减1,列数加1。
(3) 如果行列范围超出矩阵范围,则回绕。
(4) 如果按上面规则确定的位置上已有数,则将其放在上一个数的下面。*/
首先,一句一句地读这一道题,第一部分读完其实可以不用管,你不用自己去想它的算法,只需要提取出它是一个奇数阶次的;
然后就到了重要的时候,不是说算法是程序的灵魂吗。它将1放在了第一行中间一列,由于我们要构造数组所以它其实相当于在第0行,第N/2列(由于是int型,所以就是向下取整),于是一的位置便确定了下来,那么我们肯定是要输入N*N个数,也就是做一个循环,便是从1到N*N,那接下来就从2开始往右上方移动,所以它的行数要-1,而列数要+1,可以想象如果这是一个极其大的数组的话,它的效果便是一条次对角线的样子,但是由于这是一个数组,便要考虑它是否超出了数组的边界,明显行数会出现<0的情况,而列数的话则会出现>0的情况,所以此时和之前做过的24小时循环的那一道题联系起来,用一下if语句,在行数小于0和列数大于n时分别进行行数赋值为n,而列数赋值为0
此时相当于前三的条件已经满足了,而第四个条件是最为重要的,如果只有前三个条件构成的程序,跑出来就是这个样子,所以如果此时这个位置上的数!0的话,则需要对行数+1;
然后输出我们的这个数组就好啦。
源代码如下:
#include<stdio.h>
int main()
{
int i,j,r,c,n,number=1;
scanf("%d",&n);
int matrix[15][15]={0};
i=0;j=n/2;
while(number<=n*n)
{
matrix[i][j]=number;
r=i;c=j;
number++;
i--;
j++;
if(i<0) i=i+n;
if(j>=n) j=0;
if(matrix[i][j]!=0)
{
i=r+1;j=c;
}
}
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
{printf("%4d",matrix[i][j]);}
printf("\n");}
return 0;
}
哎 又改了好多次 不过结果还是让人满意的 做高数去了;