
约瑟夫环问题求解方法总结
发布日期:2021-05-07 01:32:21
浏览次数:19
分类:原创文章
本文共 871 字,大约阅读时间需要 2 分钟。
约瑟夫环问题
n个人围成圈,从第一个人开始报数,数到k的人自杀。然后自杀的下一个人接着从1开始数,一直到剩下最后一个人。
一,使用队列模拟过程
首先将这n个人入队,然后开始计数,并且不断地出队,如果当前这个人是k的倍数的话就杀掉,如果不是k的倍数就再次入队。
代码如下:
#include <iostream>#include <queue>using namespace std;void slove(int n, int k){ queue <int> que; int ans = 0; for (int i=1; i<=n; i++) que.push(i); while (!que.empty()) { int temp = que.front(); que.pop(); ans++; if (ans % k == 0) cout << temp << " "; else que.push(temp); }}int main(){ int n, k; cin >> n >> k; slove(n, k); return 0;}
数学公式法
公式就是:start = (start + k ) % n
此时需要注意的是编号必须从0开始到n-1,没办法再像上面一样随意编号了。并且它没有办法将整个过程输出出来,只能计算出最后获胜的人。
具体请看大佬的博客。
#include <iostream>using namespace std;int main(){ int n, m, i, s = 0; printf ("N M = "); scanf("%d%d", &n, &m); for (i = 2; i <= n; i++) { s = (s + m) % i; cout << s << " "; } printf ("\nThe winner is %d\n", s+1);}
发表评论
最新留言
很好
[***.229.124.182]2025年04月08日 20时06分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
微信js-sdk使用简述(分享,扫码功能等)
2019-03-05
selenium 的介绍和爬取 jd数据
2019-03-05
【分享-一键在线抠图】在线免费去除图片背景
2019-03-05
layui表格checkbox选择全选样式及功能
2019-03-05
mxsrvs支持thinkphp3.2伪静态
2019-03-05
mui HTML5 plus 下载文件
2019-03-05
环信SDK 踩坑记webIM篇(一)
2019-03-05
通信基础知识
2019-03-05
DSP开发板准备
2019-03-05
测试基本
2019-03-05
c++中istringstream及ostringstream超详细说明
2019-03-05
c++中ifstream及ofstream超详细说明
2019-03-05
c++中explicit和mutable关键字探究
2019-03-05
c语言结构体字节对齐详解
2019-03-05
linux c/c++面试知识点整理(八)
2019-03-05
linux网络编程系列(十二)--滑动窗口、拥塞控制、断线重连机制
2019-03-05
Deep residual learning for image recognition
2019-03-05
IO控制器
2019-03-05
LeetCode122.买卖股票的最佳时机2Golang版
2019-03-05