有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?
如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。
你允许:
装满任意一个水壶
清空任意一个水壶
从一个水壶向另外一个水壶倒水,直到装满或者倒空
官方给出的递归方式不太赞成,具体解释可以看官方,感觉还是考数学知识,贝祖定理。可以构建ax+by=z。找到x y的最大公约数,再看z是否为其倍数。
public boolean canMeasureWater(int x, int y, int z) {
if(z == 0){
return true;
}
if(z > x + y)
return false;
int result = 1;
if(x < y){
int tmp = x;
x = y;
y = tmp;
}
while (true){
if(y == 0){
result = x;
break;
}
int tmp = x % y;
x = y;
y = tmp;
}
if(result == 0)
return false;
return (z % result) == 0 ? true : false;
}
最无语的居然有当其中任意个水壶容量(x,y)为0。不能装水还叫水壶么?咋不说还有复数呢?搞笑的数据测试。。。