天天看點

HRBUST-1180 用c++實作報數問題

題目連結:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1180

題目描述:

有N個人圍成一圈,按順時針給他們編号為1-N。

緊接着,指定編号為M的人開始報數,報數按順時針進行。

報到D的人出列,下一個人重新開始報數。按此規律,每次報到D的人都出列。

要求同學程式設計求出出列的順序。

Input:

輸入包括多組測試用例。

對于每組用例,第一行是一個整數N,表示人數。N<100。

接下來N行是每個人的人名。人名為長度不超過20連續字元串。

最後是以兩個以","分割的整數M,D。代表從M個人開始,每報D個數出列。

Output:

輸出所求的順序

Sample Input:

8

Zhao

Qian

Sun

Li

Zhou

Wu

Zheng

Wang

4,4

Sample Output:

Zheng

Sun

Wang

Zhou

Li

Wu

Qian

Zhao

思路分析:

1.首先要知道一點,人數是有限的,圍成一個圈,标号從0-N,對數進行取N的餘數,可以構成一個圈進行循環。

2.需要解決的有三個問題,第一個數控制程式結束,即所有人都已經報數了,這個可以定義一個計數的變量,放在最外層循環。

3.第二個問題,每次有人報過數之後,需要按順時針走D步,而且已經報過數的人不算數。可以用一個flag數組來控制某個人是否報過數,具體實作看代碼

4.第三個問題,輸出報數的人,先判斷這個人是不是報過數,如果報過數,進行循環,按順時針方向,直到找到一個沒有報過數的人,進行報數。

代碼實作:

#include<iostream>
using namespace std;
int main()
{
	int i,N,M,D;
	char a;
	string s[101];
	while(cin>>N)
	{
		for(i=0;i<N;i++)
			cin>>s[i];
		cin>>M>>a>>D;
		int l=0,flag[101]={0};
		i=M-1;
		while(l<N)
		{
			for(int k=0;k<D-1;k++)//這個循環的作用是走D步,而且已經報過數的人不能算數 
			{
				while(flag[i]==1)
				{
					i++;
					i=i%N;
					if(flag[i]==0)
						break;
				}
				i++;
				i=i%N;
			}
			while(flag[i]==1)//這個循環的作用是確定目前位置的人沒有報過數 
			{
				i++; 
				i=i%N;
				if(flag[i]==0)
					break;
			}
			//接下來就是輸出報數的人 
			cout<<s[i]<<endl;
			flag[i]=1;
			i++;
			i=i%N;
			l++;
		}
	}
	return 0;
}
           

繼續閱讀