ZCMU 1643: 题目 B 报数游戏(模拟)

Description

报 2,编号为 3 的人报 3,等等。当编号为 n 的人(即最右边的人)报完 n 之后,轮到他左边的人(即编号为
n-1 的人)报 n+1,然后编号为 n-2 的人报 n+2,以此类推。当最左边的人再次报数之后,报数方向又变成从左
到右,依次类推。
为了防止游戏太无聊,报数时有一个特例:如果应该报的数包含数字 7 或者是 7 的倍数,他应当用拍手代

Input

输入包含不超过 10 组数据。每组数据占一行,包含三个整数 n,m 和 k(2<=n<=100, 1<=m<=n,
1<=k<=100)。输入结束标志为 n=m=k=0。

Output

对于每组数据,输出一行,即编号为 m 的人第 k 次拍手时,他实际上数到的那个整数。

Sample Input

4 3 1 4 3 2 4 3 3 4 3 4 0 0 0

Sample Output

17 21 27 35

通过flag2来判断此时是要正着报还是要倒着报,flag储存当前报到了哪一个人,i储存报到了第多少个数,记得每次都给b数组初始化。

#include
using namespace std;
int b[110];
bool check(int n)
{
	if(n%7==0)
	return true;
	while(n)
	{
		if(n%10==7)
		return true;
		n/=10;
	}
	return false;
}
int main()
{
	int n,m,k;
	while(cin>>n>>m>>k)
	{
		memset(b,0,sizeof(b));
		if(n==0&&m==0&&k==0)
		break;
		int flag=0;
		int flag2=0;
		int i=0;
		while(1)
		{
			i++;
			if(flag2)
			flag--;
			else
			flag++;
			if(flag==n+1)
			{
				flag=n-1;
				flag2=1;
			}
			else if(flag==0)
			{
				flag=2;
				flag2=0;
			}
			if(check(i))
			{
				b[flag]++;
				if(flag==m&&b[flag]==k)
				{
					cout<

你可能感兴趣的:(算法,c++)