【C】n个人排成一圈报数的问题

问题来自:《C程序设计》(第四版)谭浩强 清华大学出版社 第291页

有n个人围城一圈,顺序排号。从第一个人开始报数(从1报到m),凡是报到m的人退出圈子,接着从循环队列的下一位开始报数(该数为1)。问最后留下的是原来几号的那位。

注:本例为模拟题,按要求写程序即可。

示例代码:

 1 #include <stdio.h>
 2
 3 int a[100];
 4
 5 int find(int *a, int n, int m)
 6 {
 7     int counter = n;
 8     int i=0,j=0;
 9     while(counter != 1) //还剩一人时跳出循环
10     {
11         for(j=1;j<=m;) //从1报数,报到了m
12         {
13             i = (i++)%n;
14             if(a[i] != 0)
15             {
16                 j++;
17             }
18         }
19         a[i] = 0;  //将报m的人踢出队列
20         counter--;  //计数器-1
21     }
22     for(i=0;i<n;i++)
23     {
24         if(a[i] != 0)
25             return i;   //返回唯一的剩余者的位置
26     }
27 }
28
29
30 //test
31 int main()
32 {
33     int i;
34     for(i=0;i<100;i++)
35     {
36         a[i] = i;
37     }
38     printf("%d",find(a,5,3));
39     return 0;
40 }
时间: 2024-10-11 16:42:33

【C】n个人排成一圈报数的问题的相关文章

使用循环链表实现约瑟夫环(围圈报数问题)

刚开始学C,碰到经典的围圈报数问题,现先将实现代码附下: #include<stdio.h>#include<stdlib.h> struct LNODE{ //链表定义 int data; struct LNODE *next;};typedef struct LNODE Lnode;typedef struct LNODE *LinkList;struct LNODE *create(int s[]) //创建单项循环链表{ struct LNODE *head=NULL,*p

围圈报数 c

#include<stdio.h> /*围圈报数*/ void left(int *p,int m,int n) { int i,j,count; i = j = count = 0; while(count < m-1) { if(*(p+i) != 0) j++; if(j == n) { *(p+i) = 0; count++; j = 0; } if(++i == m) i = 0; } } int main(void) { int x,y; scanf("%d%d&q

【例2-3】围圈报数

[例2-3]围圈报数 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1334时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,-,如此反复到所有的人全部出列为止.设n个人的编号分别为1,2,-,n,打印出列的顺序. [输入] n和m. [输出] 出列的顺序. [输入样例] 4 17 [输出样例]

1334:【例2-3】围圈报数

1334:[例2-3]围圈报数 时间限制: 1000 ms         内存限制: 65536 KB提交数: 2253     通过数: 1482 [题目描述] 有nn个人依次围成一圈,从第11个人开始报数,数到第mm个人出列,然后从出列的下一个人开始报数,数到第mm个人又出列,…,如此反复到所有的人全部出列为止.设nn个人的编号分别为1,2,…,n1,2,…,n,打印出列的顺序. [输入] nn和mm. [输出] 出列的顺序. [输入样例] 4 17 [输出样例] 1 3 4 2 [提示]

C语言——N个人围成一圈报数淘汰问题

<一>问题描述: 有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止. 问此人原来的位置是多少号? <二>问题解决: 1.定义数组记录每个编号的状态(是否被淘汰): 2.在未被淘汰的人中检查是否数到3,若是,淘汰此人: 3.继续此过程至所有人被淘汰: <三>示例代码: 1 /* 2 16.有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 3 凡报到 3的倍数的人离

约瑟夫环问题(100围坐一圈报数,报3出圈)

100个人编号1-100,围坐一圈,从1号开始进行1,2,3报数,谁报数为3,就离开圈子,剩下的人继续报1,2,3,报数为3的出圈... 请写一段程序,计算最后一个留下来的人,他的编号 1 package com.ycl.test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Test1 { 7 public static void main(String[] args) { 8 int co

分别使用结构体和数组实现约瑟夫环(围圈报数问题之二)

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 void main() { int a[81],n,i,counter,num; //counter用来计算,num用来记录退出的人数 printf("please input total the number of person:"); scanf("%d",&n); for(i=0;i<n;i++) //为每个人编号,1~n { a[i]=

19:用两种颜色去染排成一个圈的6个棋子,如果通过旋转得到则只算一种,一共有多少种染色:

A: 10 B:11 C:14: D:15 答案:C 解释:应该有14种方案,设只有黑白两色,默认白色,那么,用p(n)表示有n个黑棋的种类 p(0)=p(6)=1 p(1)=p(5)=1 p(2)=p(4)=3 //相邻的一种,隔一个的一种,两个的一种 p(3)=4 //都相邻的一种,BB0B的一种,BB00B的一种,B0B0B的一种,一共4种 24:假设函数rand_k会随机返回一个[1,k]之间的随机数(k>=2),并且每个证书出现的概率相等.目前有rand_7,通过调用rand_7()和

围圈报数

通过进栈出栈实现循环 #include<iostream> #include<queue> using namespace std; queue<int> q; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) q.push(i); int num=1; while(!q.empty()){ if(num==m){ cout<<q.front()<<"