围圈报数

通过进栈出栈实现循环

#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()<<" ";
            q.pop();
            num=1;
        }
        else{
            q.push(q.front());
            q.pop();
            num++;
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/w-w-t/p/12287810.html

时间: 2024-10-14 20:12:11

围圈报数的相关文章

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

刚开始学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 [提示]

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

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 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]=

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

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

【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

约瑟夫环问题(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

100灯泡围圈通亮问题

问题描述 有一百个灯泡,围成一个圈.每个灯泡有一个开关.如果一个灯被打开或者关闭,那么它相邻的两个灯泡状态会与原状态相反(亮变暗,暗变亮).请问是否存在一种操作方式可以把这一百个灯泡打开(都处于亮的状态). 分析 1.将一百个等编号[1-100],设置亮为1,暗为0,初始都为02.从1号灯泡开始打开,每次隔着前一次按下编号的两个灯按,N=3n-2 (n表示第n次打开灯泡),这样一直按下去,直到只有99号灯不亮 为止,一共需要按33次.3.这个时候唯一可以操作的就是把99号灯打开,那么98,100