题目描述
最近,三师弟发现自己的棒棒糖越来越多了。于是,想出了一个主意:决定和小伙伴大师兄做个游戏,顺便分些糖果出去(估计脑洞大开了=_=)。
游戏规则是这样的。
桌上有两堆糖果,数量分别为a、b(0<=a,b<=200)。两人轮流取糖,每次从数量较多的一堆中取出数量为两堆糖果数量的最大公约数的糖果。当桌上只有一堆糖果时,轮到的那个人直接拿走。当所有糖果都被拿完,游戏结束。
大者为大,大师兄先拿。
问游戏结束时,大师兄和三师弟拿到的糖果数分别为多少?
输入
输入数据有多组,每组数据输入两个数,分别代表桌上的两堆糖果数。
输入以0 0结束(该组数据不做处理)。
输出
游戏结束时,大师兄和三师弟分别拿到的糖果数。
样例输入
2 44 29 10 0
样例输出
4 24 25 5
提示
怎样考虑两堆糖果数量相等时情况?还要考虑啥时间谁拿,前提是会求两个数的最大公约数。
#include <stdio.h>
#include<string.h>
#include<math.h>
int
fac(
int
a,
int
b)//求两个数的最大公约数。
{
int
c;
while
(b!=0)
{
c=a%b;
a=b;
b=c;
}
return
a;
}
int
main()
{
int
i,a,b,c,d,s,q;
while
(
scanf
(
"%d%d"
,&a,&b)!=EOF)
{
d=0;s=0;
if
(a==0&&b==0)
return
0;
for
(i=1;;i++)
{
if
(a==0||b==0)//其中一堆为0就跳出循环。
break
;
if
(a<b)
q=a,a=b,b=q;//永远将a当做最大。
if
(a!=0&&b!=0)
{
c=fac(a,b);
if
(i%2!=0)//因为大师兄先拿的故我将奇数看为大师兄拿糖。
d=d+c;//统计大师兄拿的糖数。
else
s=s+c;//统计三师兄拿的糖数。
a=a-c;//将最多糖的那堆减去拿去的。
}
}
if
((i)%2!=0)
d=d+a+b;//剩一堆的话看临到谁谁全拿走。
else
s=s+a+b;
printf
(
"%d %d\n"
,d,s);
}
return
0;
}