早教吧 育儿知识 作业答案 考试题库 百科 知识分享
早教吧考试题库频道 --> 计算机类考试 -->计算机三级 -->

设有n个人坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈

题目

设有n个人坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下—个人重新开始从1到m报数,如此进行下去直到所有的人都出圈为止。先要求按出圈次序,每10个人为一组,给出这n个人的顺序表。请编制函数Josegh()实现此功能并调用函数WriteDat()把编

设n=100,s=1,m=10进行编程。

注意:部分源程序已给出。

请勿改动主函数main()和写函数WritsDat()的内容。

试题程序:

include<stdio.h>

define N 100

define S 1

define M 10

int p[lOO],n,s,m;

void WriteDat(void);

void Josegh(void)

{

}

void main()

{

m=M; n=N; s=S;

Josegh ( );

WriteDat ();

}

void WriteDat(void)

{

int i;

FILE *fp;

fp=fopen ( "OUT59. DAT", "w" );

for (i=N-1; i>=0;i--)

{

printf("%4d",p[i]);

fprintf (fp, "%4d",p [i] );

if (i%10==0)

{

printf ("\n");

fprintf (fp, "\n");

}

}

fclose (fp);

}

参考答案
正确答案:void Josegh(void) { int i jkslw; s1=s; for (i=l; i=n; i++) /*给n个人从到n编号*/ p[i-1]=i; for (i=n; i>=2; i--) { s1= (s1+m-1) %i; /*下一个开始报数的人的编号是(s1+m-1 )%i*/ if (s1==0) /*若s1为0则说明要开始报数的是最后一个人*/ s1=i; w=p [s1-1]; /*将要出圈的人移至数组的最后*/ for (j=sl; j=i-1; j++) p[j-1]=p[j]; p[i-1]=w; } }
void Josegh(void) { int i, j,k,sl,w; s1=s; for (i=l; i=n; i++) /*给n个人从到n编号*/ p[i-1]=i; for (i=n; i>=2; i--) { s1= (s1+m-1) %i; /*下一个开始报数的人的编号是(s1+m-1 )%i*/ if (s1==0) /*若s1为0,则说明要开始报数的是最后一个人*/ s1=i; w=p [s1-1]; /*将要出圈的人移至数组的最后*/ for (j=sl; j=i-1; j++) p[j-1]=p[j]; p[i-1]=w; } } 解析:本题考查的知识点如下:
(1)将数组建成环。
(2)运算符“%”的使用。
(3)循环的嵌套使用。
此题是著名的“约瑟夫环”问题。首先要将每个人的编号存入数组。因为每次是从s1开始报数,若是直线队则下一个开始报数的人的编号是s1+m-1,但这里要建立一个环,即最后一个人报完数后第一个人接着报数。所以这时下一个开始报数的人的编号足(s1+m-1)%i,i是此时圈中的总人数。若所得的结果为0,则说明要开始报数的是最后一个人。在此人前面的那个人就是要出圈的人,使用循环将要出圈的人移至数组的最后。开始时,总人数为n,以后依次减1,直到最后一个人出圈。
看了设有n个人坐一圈并按顺时针方向...的网友还看了以下:

1、一群小朋友玩报数字游戏,第一个报1,第二个报4,第三个小朋友报7.依次后一个小朋友比前一个小朋 数学 2020-06-22 …

199个同学排成一列,按1-4报数,然后报几就排第几行,共排成四行.周婧是第162个同学,她将排在 数学 2020-07-18 …

199个同学排成一列,按1-4报数,然后报几就排第几行,共排成四行.周婧是第162个同学,她将排在 数学 2020-07-18 …

一个C++约瑟夫环的问题一群人围坐一圈,每人一个密码,一开始人选一个正整数作为报数上线M,丛第一个 其他 2020-07-29 …

某报告厅有m排座位,某报告厅第一排有a个作为,后面每一排总比前一排多一个座位,这个报告厅共有多少个座 数学 2020-11-07 …

五位同学依次循环报数,规定1、第一位同学首次报出1,第二位同学首次报出1,之后每位同学报出的数是前两 数学 2020-11-17 …

k个男生和k个女生站成一列,前面k个是男生,后面k个是女生,从第一个男生开始报数,报到队列最后一个同 数学 2020-11-17 …

设计一个带头结点的循环单链表类,实现约瑟夫环问题;设编号为1,2,…,n(n>0)个人按顺时针方向围 数学 2020-11-17 …

约瑟夫(Josephus)问题n个人围坐成一圈,从1开始顺序编号;游戏开始,从第一个人开始由1到m循 其他 2020-11-17 …

某DNA分子含m对碱基,其中A有a个,这DNA连续复制过程最这DNA连续复制对包嘧啶描述不正确的是A 语文 2021-01-14 …