Leetcode-365 水壺問題

裴蜀定理
對任意兩個整數a、b,設d是它們的最大公約數。那麼關於未知數x和y的方程:
ax+by=m ax+by=m
當且僅當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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章