裴蜀定理
對任意兩個整數a、b,設d是它們的最大公約數。那麼關於未知數x和y的方程:
當且僅當m是d的倍數時,a和b存在整數解。
本題
因此本題轉化爲求x,y的最大公約數
gcd(x,y)
,考慮z是否爲gcd(x,y)的倍數。
注意本題存在0 0 0這種特殊測試樣例
以及用以上水壺中的一或兩個來盛放取得的 z升水,即必須滿足x+y>=z的設定。
class Solution {
public:
bool canMeasureWater(int x, int y, int z) {
if(z==0) return true;
if(x==0&&y==0||x+y<z) return false;
return z%gcd(x,y)==0?true:false;
}
int gcd(int a,int b)//使用輾轉相除求最大公約數
{
if(a==0) return b;
if(b==0) return a;
int num=min(a,b);
while(b%num!=0||a%num!=0)
{
if(b>a)
{
num=b%a;
b=num;
}
else
{
num=a%b;
a=num;
}
}
return num;
}
};
比較規矩的輾轉相除
本質求
大數%小數。如果餘數爲0,小數即爲最大公約數,否則,大數=小數,小數=餘數,循環求解。
int gcd(int a,int b)
{
if(a>b) swap(a,b);
while(b%a!=0)
{
int tmp=a;
a=b%a;
b=tmp;
}
return a;
}