P1996 约瑟夫问题(C++_模拟)

坚强是说给别人听的谎言 提交于 2020-02-01 14:21:10

题目背景

约瑟夫是一个无聊的人!!!

题目描述

n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.

输入格式

n m

输出格式

出圈的编号

输入输出样例

输入 #1

10 3

输出 #1

3 6 9 2 7 1 8 5 10 4

说明/提示

m,n≤100

思路

把走过的点标记一遍,只有未标记过的点才算数,如果所有点都标记过了,那么程序运行结束。(dbq, 让这种水题拉低了我的博客整体题解难度,不过也体验了一把神犇切题的快感~)

源码

#include<bits/stdc++.h>
using namespace std;
int n, m, sum = 0;
int a[100], b[100];
bool judge()
{
	for (int i = 0; i < n; i++)
		if (b[i] == 0)
			return 0;
	return 1;
}
int main()
{
	cin >> n >> m;
	memset(b, 0, sizeof(b));
	for (int i = 0; !judge(); i++)
	{
		if (i == n)
			i = 0;
		if (b[i] == 0)
			sum++;
		else
			continue;
		if (sum == m)
		{
			cout << i + 1 << " ";
			b[i] = 1;
			sum = 0;
		}
	}
	return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!