问题 问答题

【说明】
设有3n+2个球互连,将自然数1~3n+2分别为这些球编号,使相连的两球编号之差的绝对值正好是数列1,2,…,3n+1中的各数,如下图所示:


其中填自然数的思想如下;
(1)先自左向右,第1列中间1个填数,然后第2列上、下2个填数,每次2列;但若n为偶数,最后1次只排第1列中间一个数。
(2)自右向左,先右第1列中间填数;若n是奇数,再右第2列中间填数。然后依次右第1列上、下2个填数,再右第2列中间1个填数,直到左第2列为止。
【程序】
#include <stdio.h>
#define size 10
int a[3][size];
void main()

int i,k,m,n;
printf("imput the n:");
scanf("%d",&n);
k=1;
for(i=0; i<=n/2; i++)

a[1][2*i]=k; k++;
if((i==n/2)&& (1) ||(i<n/2))

a[0][2*i+1]=k;
k++;
(2)
k++;


if(n%2==1)

(3)
k++;
m=n;

else
(4)
for(i=0; i<n/2; i++)

a[1][m-2*i]=k; k++;
(5)
k++;
a[2][m-2*i-1]=k; k++;

a[1][1]=k;
printf("\n");
printf(" ");
for(i=1; i<=n; i++)
printf("%6d",a[0][i]);
printf("\n\n");
for(i=0; i<=n+1; i++)
printf("%6d",a[1][i]);
printf("\n\n");
printf(" ");
for(i=1; i<=n; i++)
printf("%6d",a[2][i]);
printf("\n");

答案

参考答案:(1)(n%2==1) (2)a[2][2*i+1]=k; (3)a[1][n+1]=k;
(4)m=n+1; (5)a[0][m-2*i-1]=k;

解析:

[分析]:
本题考查C语言中具体算法的实现。
题目中要求将3n+2个球互连,并用自然数1~3n+2分别为这些球编号,使相连的两球编号之差的绝对值正好是数列1,2,…,3n+1中的各数。题目中还给出了具体的填自然数的思想。我们要完成的工作就是用C语言描述出题目中给出的思想。首先我们需要对其思想有个正确的认识,这是关键所在。
下面,我们来分析代码。结合整段程序代码,我们可以分析出,二维数组a用来存放我们要填的数字,第一维表示行数,总行数应该是3。第二维表示列数,总列数应该是n+2。其中的第(1)空所在的位置是表示一个条件判断语句的条件,在这之前已经对第1列的中间1个进行了填数,那么根据“先自左向右,第1列中间1个填数,然后第2列上、下2个填数,每次2列”的思想,再结合下面的填数程序语句,我们可以知道,此语句就是用来实现在先第1列中间1个填数后,对第2列上、下2个进行填数,每次2列这个思想的。因此,第(2)空的答案就出来了,是对第2列下(第3行)进行填数,因此,答案为“a[2][2*i+1]=k”。因为条件判断语句下面是进行了2次填数,因此可以判断n应该是个奇数,因为若n为偶数,最后1次只排第1列中间一个数,就不需要这个操作了。因此,第(1)空的作用应该是用来判断n是奇数,所以此空答案为 (n%2==1)。
第(3)空所在的位置在条件n%2==1成立的情况下才执行,条件n%2==1成立表明 n是奇数,根据若n是奇数,再右第2列中间填数的思想,我们可以知道,此处应该是对右第2列中间填数,因此,答案为a[1][n+1]=k。
第(4)空所在的位置是条件n%2==1不成立的情况下才执行,在上面我们知道 n%2==1是用来判断n是否为奇数,如果n不是奇数,我们不做什么,但为了方便后面的操作,应该将n+1的值保存起来,因此,此空的答案为m=n+1。
根据思想:若n是奇数,再右第2列中间填数。然后依次右第1列上、下2个填数,再右第2列中间1个填数,直到左第2列为止。在前面程序中,我们已经完成了前面部分,第(5)空所在的循环体就是用来完成后面部分的,在循环体中已经实现了对中、下进行填数,缺一个对上进行填数的代码,因此,第(5)空要完成的任务就是对上行进行填数,因此,答案为a[0][m-2*i-1]=k。

单项选择题
单项选择题