还是庞果网,今天和他杠上了,倒水问题。
题目详情
算法描述
初步看到这个题目,这是一个标准的倒水问题,各大公司的面试题上面出现了很多版本了。如果看过算法的书,这是一个扩展的欧几里得算法。
就是看 A*x+B*y=M这个方程有没有x,y的整数解的问题,代码非常简单,基本上照搬扩展欧几里得算法就可以了。
不明白的可以看看欧几里得算法,说得很明白了。简单的说,就是有这么一条定律:
定理
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。
简单的说,就是通过辗转相除得到一个公约数,而这个公约数是a和b互相倒水可以倒出来的,再看这个公约数是不是c的约数。
比如3和5,辗转相除以后,最大公约数是1,这个1是这么倒水倒出来的。
a倒入b,装满a再倒入b,这时a中就是1了。
再看1是不是c的约数,如果是,那就能倒1,倒1,倒1。。。一直倒满c了。
再比如4和6,辗转相除以后是2,这样,如果c是一个奇数,就到不满了。。不行你自己可以试试,加入c是7,你怎么倒都倒不了了。。
代码很简单,关键要理解欧几里得扩展算法的含义
int mod(int a,int b)
{
return b?mod(b, a%b):a;
}
bool can(int a,int b,int c) {
int res;
res=mod(a,b);
if(c%res==0)
return true;
else
return false;
}