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 1 4 3 2 4 3 3 4 3 4 0 0 0
Sample Output
17 21 27 35
我做了好几次,都错了,错的原因是每次都考虑的不全面,总是落下某个因素没考虑到。
于是可以用个for循环,一开始让y=m. 当i为奇数时,y=y+2*(n-m)。当i为偶数时,y=y+2*(m-1)。然后当y为7的倍数或者y包含7时用num来加1计数。当num=k时停止循环并输出y。
可是我并没有考虑到m=7或者m包含数字7的情况。所以一直WA。其次还没有考虑m=1和m=n的情况。当m=n.那么每个m之间都是间距 2*(m-1)。当m=1.每个m之间都是间距 2*(n-1)。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
bool ok(long long y)
{
if(y%7==0)
{
return 1;
}
else
{
long long hh=y;
if(hh%10==7)
{
return 1;
}
else
{
while(hh!=0)
{
hh/=10;
if(hh%10==7)
{
return 1;
}
}
return 0;
}
}
}
int main()
{
int n,k;
long long m;
while(cin>>n>>m>>k,n,m,k)
{
if(m>n||k>100||k<=0||n>100||n<2||m<1) break;
bool ff=0;
long long y=m,num=0;
if(ok(m))
{
num++;
if(num==k)
{
cout<<m<<endl;
continue;
}
}
if(m==n||m==1)
{
long long ho=m;
while(num!=k)
{
ho=ho+2*(n-1);
if(ok(ho))
num++;
}
cout<<ho<<endl;
}
else
{
while(num!=k)
{
for(int i=1;; i++)
{
if(i%2==1)
{
y=y+2*(n-m);
}
else
{
y=y+2*(m-1);
}
if(ok(y))
{
num++;
}
if(num==k)
{
// cout<<y<<endl;
// ff=1;
break;
}
}
}
cout<<y<<endl;
}
}
}