题目链接:点击打开链接
题目要求对1进行累乘,每次都成2-9中的一个数,谁先达到或超过n谁胜利。
如果 0 < n <= 9 ,则stan win
如果9 < n <= 18,则Ollie wins.
如果19 < n <= 36,则stan win
………………
所以讲所给的n不断除以18,直到得到一个小于18的数,如果这个数在0 到9之间,那么就是stan win 否则,ollie win
#include <stdio.h>
int main (void)
{
double n;
//注意这里是double类型,因为除以18的时候可能产生小数。
//如果用long long会造成精度损失,就会出错
while(scanf("%lf", &n) != EOF)
{
while(n > 18)
{
n /= 18;
}
if(n <= 9)
printf("Stan wins.\n");
else
printf("Ollie wins.\n");
}
return 0;
}
解题思路:
由于每次都是从p=1开始的,所以只要判断每个游戏中1为必败点还是必胜点即可。
(以下各式 / 均为取上整)依照上面所提到的算法,将终结位置,即[n,无穷]标记为必败点;
然后将所有一步能到达此必败段的点标记为必胜点,即[n/9,n-1]为必胜点;
然后将只能到达必胜点的点标记为必败点,即[n/9/2,n/9-1]为必败点;
重复上面2个步骤,直至可以确定1是必胜点还是必败点。
#include <math.h>
#include <stdio.h>
int main()
{
unsigned int n,x;
while(~scanf("%u",&n))
{
for(x=0;n>1;x++)
{
if(x&1)
n = ceil(n*1.0/2);
else
n = ceil(n*1.0/9);
}
puts(x&1?"Stan wins.":"Ollie wins.");
}
return 0;
}