您的位置:首页 > 其它

约瑟夫问题及其变形

2013-11-21 17:14 295 查看
问题:n个数排一个圈,从编号1开始删除,以后每m个数删一次,问最后一个被删除的数。2<=n<+10000, 1<=k<=10000

#include<iostream>
using namespace std;
int main()
{
	int n, m, w;
	while (cin>>n>>m, n + m)
	{
		w = 0;
		for (int i = 2; i <= n; i++)
			w = (w + m) % i;//下一个开始位置
		printf("%d %d %d\n", n, m, w + 1);
	}
	return 0;
}


变形:从第k个数开始删。

#include<iostream>
using namespace std;
#define MAXN 10000 + 10
int f[MAXN];
int main()
{
	int n, k, m;
	while (cin>>n>>k>>m)
	{
		f[1] = 0;
		for (int i = 2; i<=n; i++) f[i] = (f[i - 1] + m) % i;//找出f

		int ans = (k - m + 1 + f
) % n;//处理从k开始删除的位置问题
		if (ans <= 0) ans += n;//是负数就加一圈
		cout<<ans<<endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: