阅读以下说明和C程序,回答问题。[说明]下面的程序用Dole Rob算法生成N阶(N为奇数)魔方阵(各行、列、对角线数字之和相等)。该算法的过程为:从1开始,按如下方法依次插入各自然数,直到N2为止。①在第一行的正中插入1。②新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新位置取应选列的最下一个位置;若超出右边界,则新位置取应选行的最左一个位置。③若最近插入的元素是N的整数倍,则选同列的下一行位置为新位置。例如,3阶魔方阵如下所示:8 1 63 5 74 9 2[C程序]include

题目

阅读以下说明和C程序,回答问题。

[说明]

下面的程序用Dole Rob算法生成N阶(N为奇数)魔方阵(各行、列、对角线数字之和相等)。该算法的过程为:从1开始,按如下方法依次插入各自然数,直到N2为止。

①在第一行的正中插入1。

②新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新位置取应选列的最下一个位置;若超出右边界,则新位置取应选行的最左一个位置。

③若最近插入的元素是N的整数倍,则选同列的下一行位置为新位置。

例如,3阶魔方阵如下所示:

8 1 6

3 5 7

4 9 2

[C程序]

include<stdio.h>

include<stdlib.h>

define SIZE 50

main( )

{

int row, col, n, value;

int a[SIZE+1][SIZE+1]; /*不使用下标为0的元素*/

printf("请输入要输出魔方阵的阶数n(奇数, <%d):n=", SIZE);

scanf("%d", &n);

if(!(n%2) || n<1 || (1) ){

printf("输入数据有误!\n");

exit(0);

}

row=1; col=(n+1)/2; value=1;

while(value<= (2) ) {

a[row][col]=value;

/*计算下一位置*/

if(value%n!=0){

row--; (3) ;

if(row<1)row=n;

if(col>n) (4) ;

}

else row++;

value= (5) ;

}

printf("\n%d阶魔方阵如下所示:\n\n", n);

for(row=1; row<=n; row++){

for(col=1; col<=n; col++)

printf("%5d", a[row][col]);

printf("\n");

}

}


相似考题

2.阅读以下说明和C语言程序,将应填入(n)处的字句写在对应栏内。【说明】魔方阵,又叫幻方,在我国古代称为“纵横图”。由1…N2共N2个自然数构成每行、每列及两对角线上各数之和都相等的N×N方阵,这样的方阵就叫做N阶魔方阵。顾名思义,奇阶魔方阵就是N为奇数的幻方。奇数阶魔方阵的生成方法如下:(1)第一个位置在第一行正中。(2)新位置应当处于最近一个插入位置右上方,但如果右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置;如果超出右边界,则新位置取应选行的最左一个位置。(3)若最近一个插入元素为N的整数倍,则选下面一行同列上的位置为新位置。本题要求输入一个数据n,然后打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。例如,当n=3时,魔方阵为:8 1 63 5 74 9 2了解其生成方法后,就可以根据此方法来写出程序了。首先设置int变量i,j,m, n。其中i标记魔方阵的行;j标记魔方阵的列;n表示魔方阵的维数,通过输入得到;通过m递加得到插入的数据。数组a[MAX][MAX]用于存放魔方阵元素。这里预定义了 MAX的大小,没有采用动态分配,在此设置为15,即最大求得15×15阶魔方阵。【程序】include <stdio.h>define MAX 15void 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]); //对程序无影响,只是使输出的数每一列对齐elseprintf("%d ",a[i][j]);if(j==(n-1))printf("\n");}}

更多“阅读以下说明和C程序,回答问题。[说明] 下面的程序用Dole Rob算法生成N阶(N为奇数)魔方阵(各行、列 ”相关问题
  • 第1题:

    阅读以下说明和流程图,回答问题1-2,将解答填入对应的解答栏内。

    [说明]

    下面的流程图采用欧几里得算法,实现了计算两正整数最大公约数的功能。给定正整数m和 n,假定m大于等于n,算法的主要步骤为:

    (1)以n除m并令r为所得的余数;

    (2)若r等于0,算法结束;n即为所求;

    (3)将n和r分别赋给m和n,返回步骤(1)。

    [流程图]

    [问题1] 将流程图中的(1)~(4)处补充完整。

    [问题2] 若输入的m和n分别为27和21,则A中循环体被执行的次数是(5)。


    正确答案:[问题1] (1) n>m或nm或其它等效形式 (2) m←t (3) n←r (4) m%n [问题2] (5) 1
    [问题1] (1) n>m或nm或其它等效形式 (2) m←t (3) n←r (4) m%n [问题2] (5) 1 解析:(1)~(2)当n的值大于(等于)m时,应交换两者的值,再使用欧几里得算法;
    (3)~(4)略;
    (5)m,n和r在执行循环A前后的值分别为:

  • 第2题:

    阅读以下说明,回答问题,将解答填入对应的解答栏内。

    . [说明] 请完成流程图以描述在数据A(1)至A(10)中求最大数和次大数的程序的算法。并将此改成PAD图。该算法的流程图如下图:


    正确答案:(1)max2 =A(1) mex1 =A(2) (2)i< =10 (3)max1 =A(i)1 max2 = max1 (4)i=i+1
    (1)max2 =A(1) mex1 =A(2) (2)i< =10 (3)max1 =A(i)1 max2 = max1 (4)i=i+1 解析:本题的算法思想是:先输入A(1)到A(10)的值,然后判断前两个数的大小。用变量max1存储最大数,用变量max2.存储次大数。然后逐个读入数据,分别和max1,max2比较,保证最大的存入max1,次大的存入max2。

  • 第3题:

    设A为n阶可逆方阵,x为n维列向量,则向量Ax的模和向量x的模相等.


    错误

  • 第4题:

    阅读以下说明和C语言程序,将应填入(n)处的字句写在答题纸的对应栏内。

    【说明】

    魔方阵,又叫幻方,在我国古代称为"纵横图".由1…N2共N2个自然数构成每行、每列及两对角线上各数之和都相等的N×N方阵,这样的方阵就叫做N阶魔方阵。顾名思义,奇阶魔方阵就是N为奇数的幻方。

    奇数阶魔方阵的生成方法如下:

    (1)第一个位置在第一行正中。

    (2)新位置应当处于最近一个插入位置右上方,但如果右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置;如果超出右边界,则新位置取应选行的最左一个位置。

    (3)若最近一个插入元素为N的整数倍,则选下面一行同列上的位置为新位置。本题要求输入一个数据n,然后打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。例如,当n=3时,魔方阵为:

    816

    357

    492

    了解其生成方法后,就可以根据此方法来写出程序了。首先设置int变量i,j,m,n.其中i标记魔方阵的行;j标记魔方阵的列;n表示魔方阵的维数,通过输入得到;通过m递加得到插入的数据。数组a[MAX][MAX]用于存放魔方阵元素。这里预定义了MAX的大小,没有采用动态分配,在此设置为15,即最大求得15×15阶魔方阵。

    【程序】

    #include

    #defineMAX15

    voidmain()

    {

    intn;

    intm=1;

    inti,j;

    inta[MAX][MAX];

    printf("Pleaseinputtherankofmatrix:");

    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(i<0)//超出上界

    (4)

    if(j>(n-1))//超出右边界

    (5)

    }

    for(i=0;i

    for(j=0;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和j确定增加的元素在数组中的位置,每次增加的元素在原来的基础上加1,只是位置按魔方阵的原理存放。


    下面来看代码,在第(1)空处,还没有进入增加元素的循环中,应该是赋初值阶段,而用来确定元素在数组中位置的变量i已有值,j没有,再根据魔方阵的生成过程的第一条(第一个位置在第一行正中)可知,此空的答案应该是j=(n+1)/2-1.


    第(2)空处是一个循环条件,结合全过程来看,我们知道这个循环是不停往数组中增加元素,直到添加完n×n个元素。因此,此处是判断要添加的元素应该小于n×n.答案为m<=n*n.


    第(3)空前面是个条件选择语句,其条件是判断最近一个插入元素m是否可以被n整除。根据魔方阵的生成过程的第三条(若最近一个插入元素为N的整倍数,则选下面一行同列上的位置为新位置),即i=i+1,j不变。但由于在插入一个元素后,变量i和j会分别自动减1和加1.因此,答案为i=i+2.


    第(4)空前面也是个条件选择语句,其条件是判断是否超出上界,根据魔方阵的生成过程的第二条可以知道,如右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置,因此,此空应该填i=i+n.


    第(5)空前面是个条件选择语句,其条件是判断是否超出右边界,根据魔方阵的生成过程的第二条可以知道,如超出右边界则新位置取应选行的最左一个位置。因此,此空应该填j=j-n.

  • 第5题:

    阅读以下说明和C程序,将应填入 (n) 处的字句写在对应栏内。3、【说明】下面的程序用DoleRob算法生成N阶(N为奇数)魔方阵(各行、列、对角线数字之和相等)。该算法的过程为:从1开始,按如下方法依次插入各自然数,直到N2为止。 a.在第一行的正中插入1。 b.新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新位置取应选列的最下一个位置;若超出右边界,则新位置取应选行的最左一个位置。 c.若最近插入的元素是N的整数倍,则选同列的下一行位置为新位置。 例如,3阶魔方阵如下所示: 8 1 6 3 5 7 4 9 2【C程序】 #include<stdio.h> #include<stdlib.h> #define SIZE 50 main( ) { int row, col, n,value; int a[SIZE+1][SIZE+1]; /*不使用下标为0的元素*/ printf("请输入要输出魔方阵的阶数n(奇数,<%d):n=",SIZE.; scanf("%d",&n); if (!(n % 2)||n < 1 || (1) ) { printf("输入数据有误!\n"); exit(0); } row=1; col = (n+1)/2; value=1; while(value< = (2) ) { a[row][col] = value; /*计算下一位置*/ if(value%n !=0){ row--; (3) ; if(row<1) row=n; if(col>n) (4) ; } else row++; value = (5) ; } printf("\n%d阶魔方阵如下所示:\n\n",n); for(row = 1;row <= n; row++){ for(col = 1; col <=n; col++) printf("%5d",a[row][col]); printf("\n"); } }


    答案:
    解析:
    (1)n>SIZE,或其等价表示 (2)n*n (3)col++,或++col,或col=col+1,或其等价表示 (4)col-=n,或col=1,或其等价表示 (5)value+l,或其等价表示
    【解析】

    本题考查根据算法编写程序的基本能力。 N阶魔方阵定义为各行、列、对角线的数字之和相等。DoleRob给出了奇数阶魔方阵的算法,算法中方阵的行号和列号从1至N取值。程序中空(1)处判断n的合法性, n需为奇数,矩阵规模应不超过SIZE2。 根据题中的算法描述,由于要按次序将数值1~n2放入方阵中(在程序中以value表示每次要存入的数值),因此从1开始填入。将数值填入方阵的语句为“a[row][col]= value;”,该语句在循环中,因此循环条件为“value<=n*n”,因此,空(2)处填入“n*n”。 程序中,本次填入的数值为value的值,下一次要填入的数值为value加1,因此,空(5)处应填入“value+l”。 数值1的位置在第一行的正中间,即行号为1、列号为(n+1)/2,下一个位置即2的位置在1的右上方,即1所在位置的行号减1、列号加1。当新位置超出方阵的上边界,则新位置取应选列的最下一个位置:若超出右边界,则新位置取应选行的最左一个位置,因此对于3阶魔方阵,1填入第1行第2列,2填入第3行第3列,3填入第2行第1列,其余位置按照算法步骤b类推。因此,空(3)处填入“col++”或其等价形式,空(4)处填入“col=1或“col-=n”。需要考虑的特殊情况是本次填入的value值为N的倍数时,下一个插入位置为本次插入位置的正下方,即对于3阶矩阵,4填入3的正下方,7填入6的正下方等。