约瑟夫环问题求解方法总结
发布日期: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);}
上一篇:实体对象之间赋值——BeanUtils的使用
下一篇:属性闭包求解算法——数据库考试复习

发表评论

最新留言

很好
[***.229.124.182]2025年04月08日 20时06分12秒