不会跑

work for life

26 Aug 2017

倒水问题-经典面试题

有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水, 如何倒?

举个例子,3,5升的桶,需要倒出4升水,可以这么做:

3 % 5 = 3  //把3升水倒入5升桶
6 % 5 = 1 //把第二个3升的水倒入5升桶,最后剩下1升的也放入5升桶
9 % 5 = 4 //把第三个3升水倒入5升桶,得到4升

扩展的欧几里德算法,算法描述:

定理:

  对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数,必然存在整数对x,y ,使得gcd(a,b)=ax+by.

  根据欧几里德扩展算法,Gcd(A, B) = Ax + By,求出A和B的最大公约数,如果C能被最大公约数整除Gcd(A, B) 整除,那就可以实现水缸里恰好为C升水;

# 求最大公约数
def gcd(a, b):
    r = a % b
    while r != 0:
        a = b
        b = r
        r = a % b
    return b
# 判断是否可以倒出C升水
def test(a, b, c):
    A, B = max(a, b), min(a, b)
    if C % gcd(A, B) == 0:
        return True
    else:
        return False
comments powered by Disqus