用欧几里得算法解决倒水问题

原创 2013年12月04日 16:38:35

庞果编程大赛的题目

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

我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。

可以进行的操作是:

  1. 把一个容器灌满;
  2. 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);
  3. 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。
    问是否能够通过有限次操作,使得水缸最后恰好有C升水。


输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000

输出:0或1,表示能否达到要求。

这种倒水问题肯定不是第一次碰到,这次碰到了,一定要弄出个究竟!

首先我想到的是方程Ax+By=C,A、B、C均为整数,有没有x,y的整数解的模型。

结果意外发现了欧几里得算法早就运用于解决此类问题了。

欧几里得算法的目的是计算两个正整数A、B的最大公约数,计算过程可以描述为:

1、计算res=A%B,A对B取余;

2、若res为0,则最大公约数为B;

3、若res不为0,则进行赋值A=B,B=res,继续第一步。

计算过程清晰了,相应的函数写法也很明显了,我想到了主要是两种方式:

1、直接循环

int res(int a,int b)

{

 while(res=a%b)

    {

       a=b;

       b=res;

    }

return b;

}

退出循环后的b值即是所求的最大公约数。

2、递归写法

int res(int a,int b)

{

 return b?res(a,a%b):a;

}

有一次感受到了不理解、不会用递归就注定得多敲键盘的道理啊。

说了欧几里得算法,我们重归正题,求出了A和B的最大公约数之后,怎么判断倒水是否能成功呢?

很简单,如果C能被最大公约数整除,则有办法可以倒水成功;否则就没有办法。

以下是编程挑战赛上我的代码

#include <stdio.h>

int can(int a,int b,int c) {

   int res;

   while(res=a%b)

    {

       a=b;

       b=res;

    }

   printf("%d\n",b);

   if(c%b==0)

   return 1;

   else

   return 0;

}

//start 提示:自动阅卷起始唯一标识,请勿删除或增加。

int main()

{

   printf("%d",can(4,6,7));

}

//end //提示:自动阅卷结束唯一标识,请勿删除或增加。

总得来说,虽然这个题目不是很难,但是有助于对于这一类问题的解决,谨以此文加深点印象。


经典问题----倒水(详细解析)

倒水   有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。 可以进行的操作是: 把一个容器...
  • chinaeran
  • chinaeran
  • 2013年12月17日 12:30
  • 2456

利用DSF深度优先搜索来解容器倒水问题

在一些面试算法或智力题中,时不时会遇到容器倒水的问题,例如,有三个容器,分别是10升,7升,4升,7升和4升的容器装满了水,10升容器是空的,如果将容器a中的水倒入容器b时,必须使得a中的水全部倒完,...
  • tyler_download
  • tyler_download
  • 2015年12月07日 21:27
  • 824

逻辑思维编程-----倒水问题

其基本思想是用:用小桶容量的倍数对大桶的容量进行取余。比如3升的桶和5升的桶得到4升水可以这样做: 3 % 5 = 3 6 % 5 = 1 9 % 5 = 4 成功得到4升水。 同样,用7升...
  • huyoufu200920201078
  • huyoufu200920201078
  • 2018年01月06日 15:31
  • 97

拨开云雾见月明—分析容器的倒水问题

无意中看到一道挑战题目,难度系数一颗星,可是发现挑战的人很多,挑战成功的人反而不多。很是奇怪,于是细细看了看题目,发现它的初衷原来是如此回事儿。题目如下:            有两个容器,容积分别...
  • shijing_0214
  • shijing_0214
  • 2013年09月07日 20:05
  • 1184

UVA 571 Jugs(经典倒水问题)

题意: 在电影《虎胆龙威3》中,布鲁斯和杰克逊要面对这样一个问题,他们有一个3加仑的杯子和一个5加仑的杯子,他们被问这么把5加仑的杯子里面填满4加仑的水。 这个问题可以被描述为这样一个谜题。...
  • HelloWorld10086
  • HelloWorld10086
  • 2015年02月23日 17:39
  • 517

倒水问题(算法挑战)

我想我们都做过这么一道题: 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。 可以进...
  • findsafety
  • findsafety
  • 2013年09月11日 14:18
  • 4386

hdu1495 bfs解决倒水问题

/* 1.每次倒水时的状态 cup: v1,v2,v3,step; 2.倒水共有6种情况,可通过双重循环实现 3.实现倒水函数 4.令v3恒小于v2,临界条件v1==v2且v3==0 */ #incl...
  • yuanba_xs
  • yuanba_xs
  • 2017年02月06日 20:18
  • 264

倒水问题的基本思路

适合两种题目,没有差别 1. 给你一个容量为5升的桶和一个容量为3升的桶,水不限使用,要求精确得到4升水。 或者 2. 给你一个容量为8升的桶,桶里面装满8升的水,一个容量为5升的桶和一个容量为...
  • u011059313
  • u011059313
  • 2018年01月11日 10:35
  • 29

leetcode 365. Water and Jug Problem 两个水杯倒水问题 + 最大公约数Gcd辗转相除法

You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a...
  • JackZhang_123
  • JackZhang_123
  • 2017年10月08日 10:16
  • 199

算法题:水杯倒水的问题

之前好像在博客园看到这样的题目: 1.有3个容器,各是20升,13升,7升, 形状不同也不透明。一开始20升的容器里面装了20升水,反正倒来倒去最后要让20升和13升容器各装了10升水 2. 2...
  • cyq1162
  • cyq1162
  • 2016年11月23日 12:00
  • 435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用欧几里得算法解决倒水问题
举报原因:
原因补充:

(最多只允许输入30个字)