阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。 【说明】 设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,则此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去,直到所

admin2010-01-15  11

问题 阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。
    【说明】
   设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,则此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去,直到所有的人都出圈为止。
   现要求按出圈次序,每10人一组,给出这n个人的顺序表。
   设n=100,s=1,m=10。
   (1)将1到n个人的序号存入一维数组p中;
   (2)若第i个人报数后出圈,则将p置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置:
   (3)重复第(2)步,直至圈中只剩下p[1]为止。
   #include<stdio.h>
   #define N 100
   #define S 1
   #define M 10
   void main()
   {
       int p[100],n,s,m;
       m=M;
       n=N;
       s=S;
       int i,j,s1,w;
       s1=s;
       for(i=1;(1);i++)
             (2)=i;
       for(i=n;i>=2;i--)
       {
           s1=(3);
           if(s1==0)s1=i;
           w=(4);
           for(j=s1;j<i;j++)
               p[j-1]=p[j];
           p[i-1]=(5);
           printf("%4d",p)}
   }

选项

答案(1)i<=n (2)p[i-1] (3)(s1+m-1)%i (4)p[s1-1] (5)w

解析 题目中给出了n个人出圈问题的具体实现方法,要求用C语言来实现,结合题目中给出的方法,我们来具体分析程序。
   第(1)空是循环的判断条件,根据题目的要求和程序来看,这个循环应该用来把n个人的编号存放到数组p中,总共是n个人,那么循环上界应该是n,从程序中可以知道循环变量是i,因此此空答案为i<=n。
   第(2)空在循环体中,从上面的分析已经知道,这个循环实现将n个人的编号存放到数组p中,第一个人的编号应该存放到数组下标为0的位置,而第二个人的编号就存放到数组下标为1的位置,依此类推。因此此空答案为p[i-1]。
   第(3)空在另一个循环体中,结合整个程序来看,不难推断出此循环体应该用来实现题目中的第二个与第三个要求。此空是用来给变量s1赋一个值,从后面的程序中可以推断出,变量s1中存放的是判断当前报数的人是否该出圈,如果为0,则出圈,因此此空答案为(s1+m-1)%i。
   第(4)空是给一个变量w赋一个值,从此空上面的程序我们知道找到了要出圈的人,根据题目要求,应将出圈人的编号置于数组的倒数第i个位置上,在将其存放到倒数第i个位置时肯定要移动数组中的元素,而元素的移动是以当前位置为前提的,那么需要将当前位置人的编号先保存到变量w中,而当前位置人的编号存放在数组,p[s1-1]中,因此此空答案为p[s1-1]。
   第(5)空很明显是给p[i-1]赋一个值,而p[i-1]正好是数组的倒数第i个位置,应该用来存放当前出圈人的编号,而编号在变量w中,因此此空答案为w。
转载请注明原文地址:https://jikaoti.com/ti/ckW7FFFM
0

相关试题推荐
最新回复(0)