倒水问题的各种思考

来源:互联网 发布:小生意记账软件 编辑:程序博客网 时间:2024/05/22 13:48

这两天挑战了庞果中的倒水问题:

有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。 可以进行的操作是: 把一个容器灌满; 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸); 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。     问是否能够通过有限次操作,使得水缸最后恰好有C升水。 输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000 输出:0或1,表示能否达到要求。 函数头部: c语言:1表示可以,0表示不可以 int can(int a,int b,int c); c++语言: true表示可以,false表示不可以 bool can(int a,int b,int c); java语言:true表示可以,false表示不可以 public class Main {     public static boolean can(int a,int b,int c); } 

我给出的计算方式大致思路是比较余数的方式:

if (a < b) { t = b; b = a; a = t; }

if (c%b == 0) return true;
if (a%b != 0) if ((c%b)%(a%b) == 0) return true;

但是这个方式卡在案例 a=1234567, b=7654321, c=9999999上。

查看网上兄弟们的算法发现大多数解题思路是按照获得最大公约数的方式进行的:

public static int gcd(int a,int b){  return a == 0 ? b : gcd(b % a, a);  }

public static boolean can(int a,int b,int c){  if (c%gcd(a,b)==0) return true;return false;  }

按照这个思路确实可以通过以上那个让我抓狂的案例,但是我仍然不理解,a=1234567, b=7654321这两个数的最大公约数为1,按这个案例实际操作,怎么可能出现容器A或容器B中最后剩1升水的情况。我模拟案例的矛盾给出另一个案例:a=11,b=39,c=2,这个时候按照最大公约数的方式同样可以通过,但是我怎么也想不出具体操作中怎么把c缸灌满。


现在怎么样也没有想通,欢迎各种路过的大虾给予指教啊。要是哪天我自己想通了我也会写下想通的思路给予大家一个交代。




原创粉丝点击