报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,如此反复到所有人出列。
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,如此反复到所有人出列。设n个人的编号分别为1,2,……n,打印出列的顺序。
【算法分析】
本题可以采用建立标志位的方法求解,但如果使用循环链的思想,则解题效率更高。n个人围城一圈,把一个人看成一个节点,n个人采用链接方式,即每一个节点有一个前继节点和后继节点,每一个节点有一个指针指向下一个节点,最后一个节点的指针指向第一个节点。这就是单链循环的数据结构。当m个人出列时,将m的前继节点指针指向m节点的后继指针节点,即把m节点驱出循环链。
1.建立循环链表
当用数组实现本体链式结构时,数组a【i】作为“指针”变量来使用,a[i]存放下一个节点的位置。
设立指针j指向当前节点,则移动节点过程为j=a[i],当数到m时,m节点出链,则a[j]=a[a[j]]。
2.设立指针,指向当前节点,设立计数器,计数数到多少人。
3.沿链移动指针,每移动一个节点,计数器的值加一,当计数器的值为m时,则m节点出链,计数器的值置为1.
4.重复3,直到n个节点出链为止。
【代码如下】
#include<iostream>
using namespace std;
const int n=10,m=4;//设有十个人,报到4的人出列
int a[n+1],j=n,k=1,p=0;
int main()
{for(int i=1;i<n;i++)a[i]=i+1; //建立链表 a[n]=1; //第n个人指向第1个人 ,形成一个环 while(p<n) //n个人均出列为止 {while(k<m) //报数 计数器加一 {j=a[j];k++;}printf("%d",a[j]); //数到m此人出列 计数器置一 p++; //出列人数加一 a[j]=a[a[j]];k=1;}return 0;
}
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,如此反复到所有人出列。相关推荐
- 算法训练 - 筛选号码 (有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。)
问题描述 有n个人围成一圈,顺序排号(编号为1到n).从第1个人开始报数(从1到3报数),凡报到3的人退出圈子.从下一个人开始继续报数,直到剩下最后一个人,游戏结束. 问最后留下的是原来第几号的那位. ...
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈:下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序. 考虑问题: 报到T的人出圈,怎么表示出 ...
- 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
题目描述 有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位. 输入 初始人数为n. 输出 最后一个人的初始编号. 样例输入 3 样例 ...
- 约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
题目: 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. 解题思路: 利用数组的"0"和&qu ...
- (C++)有n个人围成一圈,顺序排号。从第一个人开始报数(1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。
(C++)有n个人围成一圈,顺序排号.从第一个人开始报数(1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号. #include<iostream> #include< ...
- C语言学习笔记——n个小孩围成一圈,顺序排号,报数报到5的出局...
问题描述:n个小孩围成一圈,顺序排号,从第一个人开始报数(从1报到5),凡是报到5的都要出局,求最后留下的人的号码. #include<stdio.h> void Game(int n) ...
- ACMNO.38 C语言-报数 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
题目描述 有n人围成一圈,顺序排号. 从第1个人开始报数(从1到3报数),凡报到3的人退出圈子.`在这里插入代码片` 问最后留下的是原来的第几号的那位. 输入 初始人数n 输出 最后一人的初始编号 样 ...
- python n个人围成一圈,Python练习代码实例69-有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的...
Python 练习实例69 题目:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. 程序分析:无. 程序源代码:#!/usr/bi ...
- (C语言)有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
题目描述 有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位. 输入 初始人数n 输出 最后一人的初始编号 样例输入 3 样例输出 2 ...
- 约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。...
首先,我最大的学习来源不是百度而是我群友~~在这里表白一波我热爱学习的群友们! 然后今天群里突然有人提出了题目的这个问题: 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人 ...
最新文章
- java的HttpClient如何去支持无证书访问https
- 视觉SLAM总结——后端总结
- zcmu-2149(归并排序)
- titanic数据集_TF2.0结构化数据建模流程范例
- Firefox年内将默认启用AV1解码
- 30+ 新鲜惊奇的 jQuery 插件与教程
- Python项目实践:文本词频统计、软文的诗词风
- python 从地址获取数据失败怎么解决_python面试题大全
- [轉]Windows下Subversion配置管理员指南
- 美股数据获取 python_python3+tesseract获取美股PEG图像上的数据
- KVM console 连接虚拟机注意的位置
- PAYPAL 支付,sandbox测试的时候遇到异常:请求被中止: 未能创建 SSL/TLS 安全通道,以及解决方法。
- Webx MVC分析
- 【多线程】 Future Callable 使用(线程池线程执行完,执行主线程)
- 浏览器了解(七)Layout
- 实验四 数组程序设计
- 树莓派4b-centos操作系统安装包
- 如何远程连接软件加密狗
- Matlab 谢尔宾斯基三角形
- hive-使用开窗函数实现百分比、topN、前百分比