文章目录

不知道怎么了,错的要死~~泥煤的蛋疼

题意:

给定两堆石子,二人轮流取子,要求只能从石子数目较大的那一堆取子,
取子的数目只能是另一堆石子数目的倍数.最终使得某一堆数目为零的一方为
对于(a,b),如果a>b且a/b>=2,则(a,b)是关键状态
谁面对这个状态则谁必胜,动手模拟一下就知道啦
之后便是计算剩下的啦;

上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
//#define max(a,b) a>b?a:b
//#define min(a,b) a>b?b:a
using namespace std;
int main(void){
int k,t,i,j;
int m,n;
int large,smale;
while(scanf("%d%d",&m,&n)!=EOF,m||n){
//if(m==0||n==0){
//cout<<"Stan wins"<<endl;
//continue;
//}
large=max(m,n);
smale=min(m,n);
bool t;
t=true;
int digit=0;
while(smale!=0){
if(large/smale>=2)//刚开始把这个if语句写到外面啦结果一直wa
{
cout<<"Stan wins"<<endl;
digit=1;
break;
}
t=!t;
k=large%smale;//这里刚开始写成了减号结果一直超时,殊不知到1是就不用再减啦。。。
large=smale;
smale=k;
}
if(digit==0){
if(t!=true)
cout<<"Stan wins"<<endl;
else
cout<<"Ollie wins"<<endl;
}
}
return 0;
}

下面和网上的一段一对比:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 #include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <functional>
using namespace std;
bool isStan;
void print()
{
if (isStan) printf("Stan wins\n");
else printf("Ollie wins\n");
}
int main()
{
int a,b,t;
while (scanf("%d%d",&a,&b),a!=0 || b!=0)
{
if (a<b)
{ t=b; b=a; a=t;}
isStan=1;
while (1)
{
if (a/b>=2)
{
print();
break;
}
t=a%b;
a=b;
b=t;
if (b==0)
{
print();
break;
}
isStan=1-isStan;
}
}
return 0;
}
文章目录