报数游戏—看起来不好报啊,实际……

 报数游戏

Description

n个人站成一行玩一个报数游戏。所有人从左到右编号为1到n。游戏开始时,最左边的人报1,他右边的人报2,编号为3的人报3,等等。当编号为n的人(即最右边的人)报完n之后,轮到他左边的人(即编号为n-1的人)报n+1,然后编号为n-2的人报n+2,以此类推。当最左边的人再次报数之后,报数方向又变成从左到右,依次类推。
为了防止游戏太无聊,报数时有一个特例:如果应该报的数包含数字7或者是7的倍数,他应当用拍手代替报数。下表是n=4的报数情况(X表示拍手)。当编号为3的人第4次拍手的时候,他实际上数到了35。
给定n,m和k,你的任务是计算当编号为m的人第k次拍手时,他实际上数到了几。

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 14 3 24 3 34 3 40 0 0

Sample Output

17212735


分析:穷举法的思路很简单

就是先分析一下,得到周期为2n,再分析到在数据两端时与中间不一样每两次的差为周期减2,中间相差有两个值,分别是(n-m)*2;和 m*2-2,可以逐次从第一次报数相加,并判断是否鼓掌。

代码如下:

#include<iostream>

using namespace std;
int panduan(int m)//判断鼓掌函数
{
    int t=0,a;
    if(m%7==0)
        t=1;
    else
        while(m>6)
    {
        a=m%10;
        if(a==7)
        {
            t=1;
            break;
        }
        else
            m=m/10;


    }
    return t;
}
int main()
{
    int n,m,k;
    while(cin>>n>>m>>k&&n!=0&&m!=0&&k!=0)
    {
        int a=panduan(m);
        int x=m;
        if(m==1||m==n)//1与n和中间数分开判断
        {
            while(a!=k)
            {
                x=x+2*n-2;
                a=a+panduan(x);


            }
        }
        else
            {
              while(a!=k)
              {
                  x=x+(n-m)*2;
                  a=a+panduan(x);
                  if(a==k)
                    break;
                  else
                  {
                   x=x+m*2-2;
                  a=a+panduan(x);
                  }
              }
            }
            cout<<x<<endl;
        }
       return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值