问答题
【说明】 魔方阵,又叫幻方,在我国古代称为“纵横图”。由1…N2 共N2 个自然数构成每行、每列及两对角线上各数之和都相等的N×N方阵,这样的方阵就叫做N阶魔方阵。顾名思义,奇阶魔方阵就是N为奇数的幻方。 奇数阶魔方阵的生成方法如下: (1)第一个位置在第一行正中。 (2)新位置应当处于最近一个插入位置右上方,但如果右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置;如果超出右边界,则新位置取应选行的最左一个位置。 (3)若最近一个插入元素为N的整数倍,则选下面一行同列上的位置为新位置。本题要求输入一个数据n,然后打印由自然数1到n2 的自然数构成的魔方阵(n为奇数)。例如,当n=3时,魔方阵为: 8 1 6 3 5 7 4 9 2 了解其生成方法后,就可以根据此方法来写出程序了。首先设置int变量i,j,m, n。其中i标记魔方阵的行;j标记魔方阵的列;n表示魔方阵的维数,通过输入得到;通过m递加得到插入的数据。数组a[MAX][MAX]用于存放魔方阵元素。这里预定义了 MAX的大小,没有采用动态分配,在此设置为15,即最大求得15×15阶魔方阵。 【程序】 #include <stdio.h> #define MAX 15 void main() int n; int m=1; int i,j; int a[MAX][MAX]; printf("Please input the rank of matrix:"); scanf("%d",&n); i=0; (1) while( (2) ) a[i][j]=m; m++; i--; j++; if((m-1)%n==0 && m>1) (3) j=j-1; if(j>(n-1)) //超出上界 (4) if(j>(n-1)) (5) for(i=0;i<n;i++) //输出魔方阵 for(j=0;j<n;j++) if(a[i][j]/10==0) printf("%d ",a[i][j]); //对程序无影响,只是使输出的数每一列对齐 else printf("%d ",a[i][j]); if(j==(n-1)) printf("/n");
【正确答案】 (1)j=(n+1)/2-1; (2)m<=n*n (3)i=i+2; (4)i=i+n; (5)j=j-n;
【答案解析】 [分析] 本题考查我们对魔方阵的理解及用C语言的实现。 题目给出了魔方阵的原理和生成过程,现在要我们往15×15的二维数组中添加元素,使其呈现魔方阵的结构。程序中的变量i和,i确定增加的元素在数组中的位置,每次增加的元素在原来的基础上加1,只是位置按魔方阵的原理存放。 下面来看代码,在第(1)空处,还没有进入增加元素的循环中,应该是赋初值阶 段,而用来确定元素在数组中位置的变量i已有值,i没有,再根据魔方阵的生成过程的第一条(第一个位置在第一行正中)可知,此空的答案应该是i=(n+1)/2-1。 第(2)空处是一个循环条件,结合全过程来看,我们知道这个循环是不停往数组中增加元素,直到添加完n×n个元素。因此,此处是判断要添加的元素应该小于n×n。答案为m<=n*n。 第(3)空前面是个条件选择语句,其条件是判断最近一个插入元素m是否可以被n整除。根据魔方阵的生成过程的第三条(若最近一个插入元素为N的整倍数,则选下面一行同列上的位置为新位置),即i=i+1,i不变。但由于在插入一个元素后,变量i和j会分别自动减1和加1。因此,答案为i=i+2。 第(4)空前面也是个条件选择语句,其条件是判断是否超出上界,根据魔方阵的生成过程的第二条可以知道,如右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置,因此,此空应该填i=i+n。 第(5)空前面是个条件选择语句,其条件是判断是否超出右边界,根据魔方阵的生成过程的第二条可以知道,如超出右边界则新位置取应选行的最左一个位置。因此,此空应该填j=j-n。
提交答案
关闭