【leetcode】打卡题目-2020-03-21

水壶问题:

提交结果:

result.png

实现代码

bool canMeasureWater(int x, int y, int z) {
    //情况0:极端情况
    if (z == 0)
        return true;
    //情况1:两个容器之和,恰好等于z,那么最理想了
    if (z == x + y)
        return true;
    //情况2:两个容器之差,恰好等于z,那么也很理想了
    if (z == abs(x - y))
        return true;
    //情况3:如果两个容器的和,小于Z,那么就没戏了
    if (z > x + y)
        return false;
    //特殊处理:排除以上情况,鉴定分母为0的情况发生
    if (x == 0 || y == 0)
        return false;
    //情况4:x+y > z,归纳为数学问题:mx+ny=z,如果存在x,y最大公约数,使得z可以被整除,即有存在解
    //使用欧几里德算法计算最大公约数
    int a, b, c;
    if (x > y) {
        a = x;
        b = y;
    }
    else {
        a = y;
        b = x;
    }
    c = a % b;
    while (c) { //取余不为0
        a = b;
        b = c;
        c = a % b; //最后b为最大公约数
    }
    printf("%d", b);
    if (0 == z % b)
        return true;
    return false;
}

可能有人比较关心其中的数学问题,即是:

x+y > z,归纳为数学问题:mx+ny=z,如果存在x,y最大公约数,使得z可以被整除,即有存在解

解释:
通俗的解释是,两个容器互相注水,必然会存在其中一个又剩余,那么这个过程就叫做取余,不断的取余的过程,必然会使得余数与另外一个容器的总量之和为最终需要的结果
假设:(7,9,1)这个输入,得到1的过程是:
满7->9, 容器9尚有余量2;
剩9->7,容器7尚有余量5;
满9->7,容器9中尚有余量4
满7->9,容器7中尚有余量3;
剩7->9,容器9中有水3;
满7->9,容器7中尚有余量1,
倒出9所有,7余量满足要求;

你可能感兴趣的:(【leetcode】打卡题目-2020-03-21)