| 人 | 1 | 2 | 3 | 4 | 3 | 2 | 1 | 2 | 3 |
| 报数 | 1 | 2 | 3 | 4 | 5 | 6 | X | 8 | 9 |
| 人 | 4 | 3 | 2 | 1 | 2 | 3 | 4 | 3 | 2 |
| 报数 | 10 | 11 | 12 | 13 | X | 15 | 16 | X | 18 |
| 人 | 1 | 2 | 3 | 4 | 3 | 2 | 1 | 2 | 3 |
| 报数 | 19 | 20 | X | 22 | 23 | 24 | 25 | 26 | X |
| 人 | 4 | 3 | 2 | 1 | 2 | 3 | 4 | 3 | 2 |
| 报数 | X | 29 | 30 | 31 | 32 | 33 | 34 | X | 36 |
4 3 1 4 3 2 4 3 3 4 3 4 0 0 0
17 21 27 35
一道简单的模拟题:要模拟出现的情况,主要要推出一个规律 在边界的位置时,下一个报数的位置就是 2*n-2;(我也不知道是怎么推出来的)
这样就可以推算出 每个编号 下一个报数的位置;直接进行判断。
#include <cstdio>
#include <cstring>
bool judge(int n)//判断函数,判断是否含7,或者是7的倍数
{
if( !(n % 7) ) return true;
while(n)
{
if( n % 10 == 7 )
return true;
n /= 10;
}
return false;
}
int main()
{
int n,m,k,i;
while(scanf("%d%d%d",&n,&m,&k)&&n&&m&&k)
{
int count=0;
for(i=7;;i++)
{
if(judge(i))
{
int x=i%(2*n-2);//得出的是初始编号
if(x==0)
x=2*n-2;
if(x==m || (x>=n && 2*n-x==m ))//符合题意的情况
count++;
if(count==k)
break;
}
}
printf("%d\n",i);
}
return 0;
}
分成了两个部分进行考虑,边界情况就直接是2*n-2,中间的间隔是两个数循环变化的;
#include <cstdio>
#include <iostream>
using namespace std;
bool is7( int n )//判断
{
if( !(n % 7) ) return true;
while(n)
{
if( n % 10 == 7 ) return true;
n /= 10;
}
return false;
}
int main()
{
int n, m, k;
while( scanf("%d %d %d", &n, &m, &k) !=EOF && n+m+k )
{
int cnt = 0, period = 2 * n - 2;
if( n == m || m == 1 )//边界的情况
{
for( int i = m; ; i += period ) if( is7( i ) )
{
cnt++;
if( cnt == k )
{
printf("%d\n", i);
break;
}
}
}
else
{
int next = 2 - m;
for( int i = m; ; swap( next, i ) )//中间的情况
{
next += period;
if( is7( i ) )
{
cnt++;
if( cnt == k )
{
printf("%d\n", i);
break;
}
}
}
}
}
return 0;
}
原文地址:http://blog.csdn.net/whjkm/article/details/39830611