/**
* @param {number} x
* @param {number} y
* @param {number} z
* @return {boolean}
*/
var canMeasureWater = function(x, y, z) {
if(x+y<z){
return false;
}
if (x==z || y==z || x+y==z) {
return true;
}
return z%GCD(x, y) === 0;
function GCD(a,b){
while (b !== 0) {
var temp = b;
b = a%b;
a = temp;
}
return a;
}
};
思路:
如果要能返回true,必须要保证,这两个数的最大公约数可以被要求获得的水z整除。
求最大公约数,这里使用了辗转相除法。
辗转相除法的原理:
假设有两个数x和y,存在一个最大公约数z=(x,y),即x和y都有公因数z,
那么x一定能被z整除,y也一定能被z整除,所以x和y的线性组合mx±ny也一定能被z整除。(m和n可取任意整数)
对于辗转相除法来说,思路就是:若x>y,设x/y=n余c,则x能表示成x=ny+c的形式,将ny移到左边就是x-ny=c,由于一般形式的mx±ny能被z整除,所以等号左边的x-ny(作为mx±ny的一个特例)就能被z整除,即x除y的余数c也能被z整除。