题目描述
有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?
如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。
你允许:
- 装满任意一个水壶
- 清空任意一个水壶
- 从一个水壶向另外一个水壶倒水,直到装满或者倒空
题目分析
该题可使用数学方法求解,我们每一次操作只能倒满x,y或者清空x,y,若干次操作之后得到z,那么我们可以得出ax+by=z,如果有解,那么可解,否则不可解。
对于ax+by=z这个问题,如果z整除gcd(x,y),那么有a,b有整数解,否则无整数解
Java代码
public boolean canMeasureWater(int x, int y, int z) {
if(x+y < z){
return false;
}else{
if(x==0 || y==0){
return z==0 || x+y==z;
}else{
return z%GCD(x,y) == 0;
}
}
}
private int GCD(int a,int b){
if(b==0){
return a;
}else{
return GCD(b,a%b);
}
}