倒水问题-->经典面试题目

题目详细:

有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。
我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。
可以进行的操作是:
把一个容器灌满;
把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);
用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。

问是否能够通过有限次操作,使得水缸最后恰好有C升水。
 
输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000
输出:0或1,表示能否达到要求。

算法:

实际上这个就是扩展的欧几里得算法,代码上照搬就可以了。

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

  也就是说, A和B辗转相除取得最大公约数D后, D是可以由A和B倒水得出来的。如果D为C的约数,则一定可以达到要求。

代码:

 1 public class PourWater {
 2     private static int can(int a, int b, int c) {
 3         int res = mod(a, b);
 4         if (c % res == 0) {
 5             return 1;
 6         } else {
 7             return 0;
 8         }
 9     }
10     
11     private static int mod(int a, int b) {
12         if (a % b == 0) {
13             return b;
14         } else {
15             return mod(b, a % b);
16         }
17     }
18     
19     public static void main(String[] args) {
20         // TODO Auto-generated method stub
21         System.out.println(can(3, 5, 4));
22     }
23 }

 

posted @ 2015-01-19 13:55  Lone_Wolf  阅读(2105)  评论(0)    收藏  举报