【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余量满足要求;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 极端讨厌我这个畏首畏尾优柔寡断的性格。再不改变未来肯定要摔在这上头。所以呢,意识到了这一点,有没有去做出行动改变?...
    白玉离尘阅读 470评论 0 0
  • 有人说自信是别人给不了的,其实我是有点纳闷的,人不都是在自己最好的状态时,被别人认可最多时最自信。难道一个人在遭到...
    1e1f0856e783阅读 1,054评论 0 2