水壶问题:
提交结果:
result.png
实现代码
bool canMeasureWater(int x, int y, int z) {
//情况0:极端情况
if (z == 0)
return true;
//情况1:两个容器之和,恰好等于z,那么最理想了
if (z == x + y)
return true;
//情况2:两个容器之差,恰好等于z,那么也很理想了
if (z == abs(x - y))
return true;
//情况3:如果两个容器的和,小于Z,那么就没戏了
if (z > x + y)
return false;
//特殊处理:排除以上情况,鉴定分母为0的情况发生
if (x == 0 || y == 0)
return false;
//情况4:x+y > z,归纳为数学问题:mx+ny=z,如果存在x,y最大公约数,使得z可以被整除,即有存在解
//使用欧几里德算法计算最大公约数
int a, b, c;
if (x > y) {
a = x;
b = y;
}
else {
a = y;
b = x;
}
c = a % b;
while (c) { //取余不为0
a = b;
b = c;
c = a % b; //最后b为最大公约数
}
printf("%d", b);
if (0 == z % b)
return true;
return false;
}
可能有人比较关心其中的数学问题,即是:
x+y > z,归纳为数学问题:mx+ny=z,如果存在x,y最大公约数,使得z可以被整除,即有存在解
解释:
通俗的解释是,两个容器互相注水,必然会存在其中一个又剩余,那么这个过程就叫做取余,不断的取余的过程,必然会使得余数与另外一个容器的总量之和为最终需要的结果
假设:(7,9,1)这个输入,得到1的过程是:
满7->9, 容器9尚有余量2;
剩9->7,容器7尚有余量5;
满9->7,容器9中尚有余量4
满7->9,容器7中尚有余量3;
剩7->9,容器9中有水3;
满7->9,容器7中尚有余量1,
倒出9所有,7余量满足要求;