版权声明:本文由作者原创,如需使用请联系作者,侵权必究 https://blog.csdn.net/Elliot_Alderson/article/details/81906129
也是感觉之前写的代码太烂了所以来更新一波....
Ø 题目描述
最近,三师弟发现自己的棒棒糖越来越多了。于是,想出了一个主意:决定和小伙伴大师兄做个游戏,顺便分些糖果出去(估计脑洞大开了=_=)。
游戏规则是这样的。
桌上有两堆糖果,数量分别为a、b(0<=a,b<=200)。两人轮流取糖,每次从数量较多的一堆中取出数量为两堆糖果数量的最大公约数的糖果。当桌上只有一堆糖果时,轮到的那个人直接拿走。当所有糖果都被拿完,游戏结束。
大者为大,大师兄先拿。
问游戏结束时,大师兄和三师弟拿到的糖果数分别为多少?
输入数据有多组,每组数据输入两个数,分别代表桌上的两堆糖果数。
输入以0 0结束(该组数据不做处理)。
提示
怎样考虑两堆糖果数量相等时情况?
Ø 考核知识点
简单的分配问题
Ø 解题思路
本题当中,要注意每次取的糖果给大师兄还是三师弟,也就是说需要有一个标识用的东西来告诉我们现在分配的糖果是给谁的,然后就是考虑两堆糖果相等时直接一人一堆,以及分配的循环在a,b都为0时退出。
然后这一题就没什么难度咯~
#include<stdio.h>
long long int calculate(long long int a, long long int b)//在此定义找最大公约数的函数
{
long long int c;
while (b != 0)
{
c = a % b;
a = b;
b = c;
}
return a;
}
int main()
{
long long int a, b, n, m;//a,b分别表示两堆糖各有多少,n,m代表两个人有多少
int s;//设置标记变量,当s==1时把糖给大师兄,s==-1时给三师弟
while (scanf("%lld %lld", &a, &b), a || b)//死循环,当输入0 0时结束
{
s = 1;
m = n = 0;
while (a != 0 || b != 0)//这里只需要保证有一个不为0就继续取糖
{
if (a == b)//如果相等就直接一人一堆
{
n += a;
m += a;
printf("%lld %lld\n", n, m);
break;
}
if (a == 0 || b == 0)//如果其中一堆分完了,则直接把剩下的给另一个人
{
(s == 1 ? n : m) += a == 0 ? a : b;
printf("%lld %lld\n", n, m);
break;
}
(s == 1 ? n : m) += calculate(a, b);
(a > b ? a : b) -= calculate(a, b);
s *= -1;
}
}
return 0;
}