转载@imudges_Hsl的代码并改进了一点点。
#include<iostream>
using namespace std;
bool trueA;//判断A说的话是真是假
bool trueB;//判断B说的话是真是假
int result;//结果
//深搜函数
void dfs(int num_A,int num_B,int factor)
{
//当前查找的因子(就是第几个气球)
int k=factor;
//如果A,B两个数都被成功的除到了1就退出。证明A是好人。。。他说实话了
if(num_A==1&&num_B==1)
{
trueA=1;
return;
}
//如果只有B是成功的被除到了1证明B是对的。B没说谎。
if(num_B==1)
{
trueB=1;
}
//循环判断每个气球到底是谁踩的,会不会发生冲突
while((k<num_A||k<num_B)&&k++)
{
//一共一百个气球,到了100就应该退出。
if(k>100)
{
return;
}
//判断当前的A能不能整除这个当前气球上的数字
if(num_A%k==0)
{
//如果能就用A/k和B进入下一层分支
dfs(num_A/k,num_B,k);
//如果运算完A说实话了,直接退出就OK
if(trueA==1)
return;
}
//判断当前的B能不能整除这个当前气球上的数字
if(num_B%k==0)
{
//如果能就用A和B/k进入下一层分支
dfs(num_A,num_B/k,k);
//如果运算完A说实话了,直接退出就OK
if(trueA==1)
return;
}
}
}
int main()
{
int num_a,num_b;
while(cin>>num_a>>num_b)
{
//保证A大B小
int temp;
if(num_a<num_b)
{
temp = num_a;
num_a = num_b;
num_b = temp;
}
//初始化两个标记
trueA=0;
trueB=0;
//进入递归
dfs(num_a,num_b,1);
//结果初始化
result = num_a;
//只有B说了实话,A说了假话的情况结果胜出者才是B
if(trueB==1&&trueA==0)
{
result = num_b;
}
cout<<result<<endl;
}
return 0;
}