1. 程式人生 > >2014校選題(五) -- 約瑟夫環問題

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;
}