倒水

  有两个容器,容积分别为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); }

分析

  经典的倒水问题,有不少公司也出了类似的面试题目,有的以选择题形式出现,也有编程题形式出现的,下面做简要的分析:

  对题目做简要的处理分析后,C升水是可以分多次倒入的,假设A > B,那么每次可以倒的水的量为A , B , (A + B) ,( A - B)升水,设置4个因子,分别为x1 ,  x2,  x3,  x, (x1 , x2, x3, x4 属于整数),如果可以使得水缸最后恰好有C升水,那么必然存在整数x1 , x2, x3, x4,使得

          Ax1 + Bx2, +  (A + B)x3  + (A - B)x = C    等式成立;

  对等式做一定的变换,得到公式

          (x1 + x+ x4)A + (x2 + x- x4)B = C ;     --( 1-1 )

  设 x = x1 + x+ x, y = x2 + x- x4 ,  x, y 均为整数;最终得到公式

          xA + yB = C ;                                               --( 1-2 )

   x1 ,  x2,  x3,  x可以假设为正整数,用几个for循环可以实现,但是时间复杂度太大,为O(N4),题目中给的范围是0 < A , B, C <= 1000000000;整数在十亿范围,显然运行时间肯定会超过 3s ,不符合要求,那有没有更加合适的方法呢,在算法的书里面,有一个算法,与公式( 1-2 ) 不谋而合,是扩展的欧几里德算法,算法描述:

定理:

对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by.
根据欧几里德扩展算法,Gcd(A, B) = Ax + By,求出A和B的最大公约数,如果C能被最大公约数整除Gcd(A, B) 整除,那就可以实现水缸里恰好为C升水;
那题目就直接转换为求A 、B的最大公约数了,求公约数可以用辗转相除法,代码如下:
#include "stdio.h"
int can(int a,int b,int c){int n = a%b;while(n!=0){a = b;b = n;n = a%b;}if (c%b == 0)return 1;else return 0;
}
int main(){int a,b,c;printf("输入a,b,c\n");scanf("%d%d%d",&a,&b,&c);if ((can(a,b,c))){printf("yes");} else {printf("no");}
}    

感谢大卫david的倒水博文.本文是转发他的文章

转载于:https://www.cnblogs.com/kaikai7/p/3301913.html

辗转相除法应用之倒C语言实现相关推荐

  1. c语言l利用辗转相除法约分,如何用c语言求最大公约数和最小公倍数

    如何用c语言求最大公约数和最小公倍数 输入两个正整数m和n, 求其最大公约数和最小公倍数. <1> 用辗转相除法求最大公约数 算法描述: m对n求余为a, 若a不等于0 则 m 否则 n ...

  2. PTA练习:谁先倒.(C语言)

    划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒.两人同赢或两人同输 ...

  3. c语言有参有类最小公倍数,C语言求最大公约数和最小公倍数算法

    C 语言求最大公约数和最小公倍数算法 C 语言求最大公约数和最小公倍数可以说是C 语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容.其算法方面除常用的辗转相除法外.还 ...

  4. c语言怎样求最大公约数,c语言求最大公约数

    求差判定法. 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60 ...

  5. 代码实现 —— 多项式的最大公因式(线性代数)

    系列文章目录 文章目录 系列文章目录 前言 一.最大公因式 1.定义: 2.说明: 二.辗转相除法 1.带余除法 2.引理 3.辗转相除法求最大公因数 4.辗转相除法求最小公倍数 三.C语言实现 1. ...

  6. Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理、倒排索、建立查找树、处理Hash冲突、Hash查找)

    Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理.倒排索.建立查找树.处理Hash冲突.Hash查找) 目录 一.SimHash算法 1.SimHash算法五个步骤 2. ...

  7. c语言乘法口诀倒三角,乘法口诀表,C语言实现

    ▲C语言实现乘法口诀表的输出 ①正三角输出#include int main() { int i, j = 0; for (i = 1; i <= 9; i++) { for (j = 1; j ...

  8. 【C语言练习】求两个数m和n的最大公约数(辗转相除法)

    求两个数m和n的最大公约数 一.编程思路 1.首先,题目里是两个数,我们自然而然要想到定义两个变量: 2.其次,我们的目的是寻找最大公约数,所以要搞清楚其概念:两个或多个整数共有约数中最大的一个 3. ...

  9. C语言试题三十一之判断字符串是否为回文?若是则函数返回1,主函数中输出yes,否则返回0,主函数中输出no。回文是指顺读和倒读都是一样的字符串。

    1. 题目 请编写函数function,该函数的功能是:判断字符串是否为回文?若是则函数返回1,主函数中输出yes,否则返回0,主函数中输出no.回文是指顺读和倒读都是一样的字符串. 2 .温馨提示 ...

最新文章

  1. python将string转换为json_python -- 将string转换成dict的方法
  2. HTML5全屏API
  3. 写一个程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示。(单词之间用空格隔开,如“Hello World My First Unit Test”);...
  4. 数学--数论---P4718 Pollard-Rho算法 大数分解
  5. 在您的Maven-Fu包中增加了一些东西
  6. rsync 一条命令实现远程文件传输
  7. linux 32bit 改为64bit问题
  8. vue路由1:基本使用
  9. linux /proc/stat 计算线程cpu,Linux下用/proc/stat文件来计算cpu的利用率(附源码)
  10. 微软高性能网络编程示例程序
  11. 我,开了五年快递站,现在还没回本
  12. Matlab中持久变量(persistent)在Python中的理解
  13. 啸叫抑制(howling suppression)
  14. 关于用EAC抓轨的测试 (转载)
  15. lol服务器不稳定领皮肤,LOL免费领“源代码娜美”皮肤 官方致歉游戏卡顿问题...
  16. osgEarth示例分析——osgearth_elevation
  17. 每日写题分享--包含min函数的栈/双栈实现
  18. 纯css实现翻书效果
  19. Java基础语法的思维导图
  20. Safari 与 Edge:哪种浏览器更适合 Mac

热门文章

  1. 通向财务自由之路05_选择一个有效的理念
  2. python安装包的方法与图解_Python包的几种安装方法,方式
  3. web报表工具FineReport使用中遇到的常见报错及解决办法(一)
  4. 乌邦图怎么装php,Ubuntu如何安装php7?
  5. linux 日志 转存,如何记录linux终端下的操作日志(转)
  6. STL常用函数总结-map
  7. pytorch学习笔记(三十七):Adam
  8. R语言中,保留含有特定字符的元素
  9. hihocoder第226周:打表找规律
  10. Uncaught Error: Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)