问题 H: Josegh问题(函数)C++

题目如下:

问题 H: Josegh问题(函数)
时间限制: 1 Sec  内存限制: 128 MB
提交: 181  解决: 128
[提交][状态][讨论版]
题目描述
设有m个人(m不超过30)围坐一圈并按顺时针方向从1到m编号,从第1个人开始进行1到n的报数,报数到第n个人,此人出圈,再从他的下一个人重新开始从1到n的报数,如此进行下去直到所有的人都出圈为止。现要求给出这m个人的出圈次序顺序表。编写函数Josegh()实现此功能。在主函数中输入m与n的值,调用Josegf()函数。

输入
测试数据的组数 t
第一组 m  n
第二组 m  n
.......

输出
第一组出列顺序
第二组出列顺序
.........

样例输入
2
13 3
20 5
样例输出
3 6 9 12 2 7 11 4 10 5 1 8 13
5 10 15 20 6 12 18 4 13 1 9 19 11 3 17 16 2 8 14 7

代码如下:

#include<iostream>
using namespace std;
int main() {
	int t;
	cin >> t;
	while (t--)
	{
		int child[31];
		int	m;
		int n;
		cin >> m >> n;
		for (int i = 0; i < m; i++)
		{// m表示有多少个小孩
			child[i]=i+1;
		}
		int j = -1;//下一个值就是第一个小孩所在的下标0
		int k = 1;//取一能让最后剩下的是一个小孩
		while (1)
		{
			
			for (int i = 0; i < n; )//数n个小孩
			{
				j = (j + 1) % m;//绕圈的
				//并且数到循环的最后一个i=n-1个的时候j保存了这次取出的小孩index
				if (child[j]!=0)
				{//不是0的小孩才是有效的
					i++;
				}
			}
			if (k==m)
			{
				break;//终止数孩子活动
			}
			
			cout << child[j] << " ";
			child[j] = 0;//将取出的孩子赋值为0,代表为取出
			k++;
		}
		cout<< child[j] << endl;//输出最后的胜者并且不带空格的换行

	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41956151/article/details/88134686
今日推荐