倒水问题-经典面试题
有两个容器,容积分别为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