OJ 报数游戏(多种方法)

article/2025/11/8 23:18:25

描述

n个人围成一圈(编号为1 - n),从第1个人开始报数,报到k的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。

例如:n = 3,k = 2。2号先出列,然后是1号,最后剩下的是3号。

输入
输入为单组测试数据。

输入2个数n和k,表示n个人,数到k出列。(2 <= n, k <= 200)

输出
输出一个整数表示最后剩下的人的编号。

输入样例 1

10 3

输出样例 1

4

此题为经典的约瑟夫环问题,下面简单地了解一下这个问题:

一、问题的来历
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲在一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。问题是,给定了总人数n和报数值m,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

二、问题的基本描述
n个人围成圈,依次编号为1、2、3、…、n,从1号开始依次报数,报到m时,报m的人退出,下一个人重新从1报起,当报到m时,报m的人退出,如此循环下去,问最后剩下的那个人的编号是多少?

三、解题方法
(一)、队列

#include <iostream>
#include <queue>
using namespace std;
int main()
{int n, m;cin >> n >> m;queue<int> q;for (int i = 1; i <= n; i++){q.push(i);}int cur=1;while(q.size() > 1){int x = q.front();q.pop();if (cur == m){cur = 1;}else{q.push(x);cur++;}}cout << q.front() << endl;return 0;
}

(二)、指针

#include <stdio.h>int main()
{int i,k,t,m,n,num[50],*p;scanf("%d%d",&n,&m);p=num;for (i=0;i<n;i++)*(p+i)=i+1;i=0;k=0;t=0;while (t<n-1){if (*(p+i)!=0)k++;if (k==m){*(p+i)=0;k=0;t++;}i++;if (i==n)i=0;}while(*p==0)p++;printf("The last one is NO.%d\n",*p);return 0;
}

(三)、数组

#include<iostream>using namespace std;
int main()
{int n = 0;cin>>n;int arr[100];//初始数组for(int i = 0; i < n; i++)arr[i] = i+1;int count = 0;//报数计数int m = 0;//退出人数计数for(int i = 0; i<n; i++){if(arr[i]!=0){count++;if(m == n - 1){cout<<arr[i]<<endl;break;}if(count == 3){count = 0;m++;arr[i] = 0;}if(i == n - 1){i = -1;}}}return 0;
}

(四)、链表

#include<iostream>using namespace std;
struct number
{int num;struct number *next;
};
int main()
{int i,n,m;while(cin>>n>>m){struct number *p,per[100],*pre;for(i=0;i<n;i++){per[i].num=i+1; //初始化数值if(i==n-1)per[i].next=&per[0]; // <循环>链表的建立elseper[i].next=&per[i+1];}p=per;for(i=1;;i++){if(i==m){pre->next=p->next;cout<<p->num<<endl; // 数到m ,m退出,输出数值}if(i==m+1)i=1; //循环pre=p;p=p->next;if(p==pre)break; //只剩下最后一个了}cout<<p->num<<endl;}return 0;
}

(五)、公式法

#include <stdio.h>
int main()
{int n, m, i, s = 0;scanf("%d%d", &n, &m);for (i = 2; i <= n; i++){s = (s + m) % i;}printf ("%d\n", s+1);return 0;
}

以下是对约瑟夫环问题的补充,里面有关于公式法的详细讲解:

原文链接:https://blog.csdn.net/u011500062/article/details/72855826

PS:如果觉得我的文章对你有帮助或者有所启发的话,点赞鼓励一下吧!
如果我的文章有错,还望不吝赐教,嘻嘻!
在这里插入图片描述


http://chatgpt.dhexx.cn/article/qo9KY38G.shtml

相关文章

python——报数游戏

报数游戏 模拟报数游戏。有n个人围成一圈&#xff0c;顺序编号&#xff0c;从第一个人开始从1到k&#xff08;假设k3&#xff09;报数&#xff0c; 报到k的人退出圈子&#xff0c;然后圈子缩小&#xff0c;从下一个人继续游戏&#xff0c;问最后留下的是原来的第几号。 思路 …

队列应用之报数问题

题目描述&#xff1a; n个人从左向右编号1~n&#xff0c;然后从左向右报数“1,2,1,2,1,2...” 数到1的人出队&#xff0c;数到2的人立即站到队列的最右端继续报数&#xff0c;直到所有人出列。 思路: 编写进队出队函数&#xff0c;先依次进队&#xff0c;然后遍历&#xff0c…

C语言(经典编程题:报数游戏)

题目描述 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 题目分析 这便是整体的题目流程&#xff0c;大家围成一个圈&#xff0c;愉快的报着数&#xff0c;报到3的人直接out&#xff0c;下一个小伙伴再次从…

报数问题(C语言)

报数问题&#xff08;C语言&#xff09; 一、题目描述二、裁判测试程序样例三、输入/输出输入样例输出样例 四、解题思路五、示例代码六、运行情况 一、题目描述 报数游戏是这样的&#xff1a;有n个人围成一圈&#xff0c;按顺序从1到n编好号。从第一个人开始报数&#xff0c;…

国外cloudflare免费cdn缓存配置和测速工具

测速工具 1.PageSpeed Insights https://developers.google.com/speed/pagespeed/insights/ 2.Pingdom https://tools.pingdom.com/#5d4abe0c0cc00000 3.webpagetest https://performance.sucuri.net/domain/ 4.GTmetrix https://gtmetrix.com/reports/ 5.uptrends https:…

国外服务器使用CDN加速怎么样

用得上国外服务器的&#xff0c;大部分都是做外贸网站的站长了&#xff0c;经营外贸网站首先就要选择一款稳定快速的服务器主机。不论站长是选择虚拟主机还是VPS云主机或者是独立服务器&#xff0c;网站速度问题都是要放在首位考虑的。 我们常用的外贸主机就是美国主机&#x…

CDN介绍

基本原理 CDN的基本原理是广泛采用各种缓存服务器&#xff0c;将这些缓存服务器分布到用户访问相对集中的地区或网络中&#xff0c;在用户访问网站时&#xff0c;利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上&#xff0c;由缓存服务器直接响应用户请求。…

CDN技术详解

第一章 引言 1.1 CDN的基本概念和产生背景 CDN&#xff1a; Content Distribute Network&#xff1a; 内容分发网络&#xff0c;或者&#xff0c;Content Delivery Network&#xff1a;内容交付网络 我们常说的互联网&#xff0c;是广义的互联网&#xff0c;由两层组成&…

如何搭建自己CDN服务器

转自&#xff1a; https://blog.csdn.net/qq_35461287/article/details/55050583 如何搭建自己CDN服务器 目前在免费CDN市场上&#xff0c;360因为“免费”而越做越大&#xff0c;加速乐做的很早。但因免费的节点不多&#xff0c;好多用户都被强走了。安全宝现在也还不错。目前…

一文明白CDN加速是个啥

作者:IT王小二 博客:https://itwxe.com 不知不觉三个月没更新了,这三个月诸事繁忙啊!最近没那么忙了,开始恢复更新。 一、CDN简介 CDN(Content Delivery Network)是指内容分发网络,也称为内容传送网络,这个概念始于1996年,是美国麻省理工学院的一个研究小组为改善互联…

CDN技术介绍

引言 随着Internet技术和多媒体技术的不断发展&#xff0c;图像、音频、视频服务所占的比重越来越大&#xff0c;加之网民数量激增&#xff0c;网络访问距离过长&#xff0c;导致网络负载迅速增加&#xff0c;从而使用户的访问质量受到严重影响。传统的缓存技术对交互性强和比…

阿里云国际版CDN真的这么神奇吗?

阿里云国际版的内容分发网络CDN(全称Content Delivery Network)是建立并覆盖在承载网之上&#xff0c;由遍布全球的边缘节点服务器群组成的分布式网络。阿里云国际版CDN能分担源站压力&#xff0c;避免网络拥塞&#xff0c;确保在不同区域、不同场景下加速网站内容的分发&#…

修复cdn服务器连接异,cdn服务器连接异常怎么处理

cdn服务器连接异常怎么处理 内容精选 换一换 通过Web浏览器无法登录资源,提示由于资源连接失败或不可达,当前无法访问。如果持续出现该问题,请通知系统管理员或检查系统日志(Code:C_519)。CBH系统与资源服务器之间网络连接不稳定,导致连接失败。CBH系统到资源服务器的网络…

亲身尝试!国内外几间出名CDN服务商使用心得

从十月中旬就开始折腾CDN的事情&#xff0c;前前后后算起来也有差不多一个月了吧&#xff0c;期间试过了几乎所有能想到、能用上的CDN服务商&#xff0c;终于找到了一家适合自己的。 先讲一下自己的探索过程吧&#xff0c;顺带排排雷&#xff1a; 首先我想到的就是自己曾经用…

海外cdn加速有用吗?

如何使用CDN服务给网站提速&#xff1f; CDN是一个策略性部署的整体系统&#xff0c;能够帮助用户解决分布式存储、负载均衡、网络请求的重定向和内容管理等问题&#xff0c;CDN代表了一种基于质量与秩序的网络服务模式。 1.想要完成CDN对网站的加速服务&#xff0c;先要在大…

海外CDN加速的方方面面

免备案cdn是什么 CDN加速免备案也就是在海外的节点&#xff0c;像香港、美国等地区的服务器&#xff0c;如果是国内的服务器&#xff0c;也还是需要备案的。 海外多节点高防服务器部署&#xff0c;CDN加速免备案原理是将源站内容分发至海外多个高防服务器节点&#xff0c;通过…

[Anaconda学习]本地查看代理ip,anaconda挂代理

**anaconda为什么要挂代理&#xff1f;**如果不挂代理某些第三方库可能出现下载不完全的情况。 1、本地电脑查看所挂代理的ip地址&#xff08;笔者使用的是六尺巷挂代理访问外网&#xff0c;一个月25&#xff0c;但是供应商软件不支持查看代理ip地址&#xff09;步骤&#xff1…

挂代理的几种方式

1.kali中挂代理 执行命令如下所示&#xff1a; rootKali:~# leafpad /etc/proxychains.conf 可视化显示配置文件信息 在配置文件底部添加代理&#xff0c;一般用SOCKS4和SOCKS5 因为proxyresolv保存在/usr/lib/proxychains3/目录中&#xff0c;而不能被执行。proxyresolv会被…

KALI虚拟机挂代理教程

需要你本地挂了代理&#xff0c;然后通过虚拟机连接本机代理端口&#xff0c;不说废话了&#xff0c;直接说怎么做了。 1.查看选项设置中自己的小飞机的本地端口是多少&#xff1a;&#xff08;默认是1080&#xff09; 2.本机winr打开cmd&#xff0c;输入ipconfig查看本地ip…

AWVS挂代理扫描

端口填远程机开启的BP端口&#xff0c;地址填远程机的IP&#xff0c;如果出现验证码报错&#xff0c;那就是你软件破解的有问题