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

原创 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升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。 可以进...

【算法学习】双调欧几里得旅行商问题(动态规划)

双调欧几里得旅行商问题是一个经典动态规划问题。《算法导论(第二版)》思考题15-1和北京大学OJ2677都出现了这个题目。 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程。这个解的...

最近点对问题(欧几里得算法)

算法设计技巧与分析p123算法6.7 这是一个相当有难度的问题,给出n个点在O(nlogn)的时间复杂度内求出距离最近的两点间的距离,具体分析可以参考书本,用到了分治的思想,另外,注意每个点最多只需...

双调欧几里得旅行商问题-《算法导论》

题目描述 给定平面上n个点作为输入,要求从最左端的点开始,严格向右前进,直到最右端的点,再严格向左前进到第一个点,每一个点只能经过一次。 主算法: d(i,j)d(i,j)表示两个人第一个点出发...

【算法导论】双调欧几里得旅行商问题

首先,庆贺一下自己解决了(看懂了传说中的niubility的旅行商问题) 其次,马上要看到著名的贪心算法问题了!心中无比的激动。 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程。这个...

近似算法-欧几里得旅行商问题JAVA语言

1、问题描述 “旅行商问题”是指一名售货员要拜访多个地点时,如何找到从起始节拜访所有节点且仅拜访一次,最后回到起始节点的最短路径。最终形成的是一条闭合的回路,如图一所示。欧几里得旅行商问题是一种特殊...

算法导论第十五章习题15-1--双调欧几里得旅行商问题

思路:1),首先将所有点加上坐标,x轴指向右,y轴指向下。然后将所有点按照x轴坐标从小到大排列。 2)总体思路是依次从排好序的节点取出一个节点,决定该节点应该放在第一条路径上还是第二条路径上。  3...

欧几里得算法求最大公约数

  • 2014年03月25日 09:26
  • 524B
  • 下载

数学(扩展欧几里得算法)经典模板

poj2142原题链接 这道题大概题意就是说已经给出了a,b,c,然后分别求出ax+by=c里边的x,y,注意这里可能就是ax-by=c或者by-ax=c两种情况,如果要分这几种情况讨论的话...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用欧几里得算法解决倒水问题
举报原因:
原因补充:

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