2014校选题(五) -- 约瑟夫环问题


题目五

周末了,ACM训练队的队员准备玩玩游戏,娱乐一下,队长想了一个好主意,所有队员站成一个圈,从1开始报数,凡是报出指定数字的人要出列。有人出列后,下个人重新从1开始报数。最后一位“幸存者”要给大家表演个节目。由于队员正在不断的壮大,小张想知道他是否需要准备表演,请你设计个程序,帮他确定他是否是“幸存者”。

【输入】

第一行是n,有n次游戏,第二行是 m   x,表示某次游戏有m个人,指定被请出列的数字为x。其中n<100,m<1000

输出

最后幸存的那位的原来的号码。

【样例输入】

 1

 10   5

样例输出

3


#include <stdio.h>

int main()
{
	int n;
	int i = 0;

	scanf("%d", &n);

	while (i < n)
	{
		int m;    //人数
 		int x;    //指定出列的数字
		int j;

		int a;  //结果

		scanf("%d%d", &m, &x);  // 人数  出列的数字

		a = 1;

		for (j=2; j<=m; j++)
		{
			a = (a + x - 1) % j + 1;  //为了防止 if (f[n]==0) f[n]=n;
		}

		printf("%d\n", a);


		i++;
	}

	return 0;
}


简化    可以先以0-n-1的方式排成序列 最后结果加1

#include <stdio.h>

int main()
{
	int n;
	int i = 0;

	scanf("%d", &n);

	while (i < n)
	{
		int m;    //人数
 		int x;    //指定出列的数字
		int j;

		int a;  //结果

		scanf("%d%d", &m, &x);  // 人数  出列的数字

		a = 0;

		for (j=2; j<=m; j++)
		{
			a = (a + x ) % j; 
		}

		printf("%d\n", a+1);


		i++;
	}

	return 0;
}


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值