• 牛顿法(Newton's Method)


    [算法][庞果网]倒水问题/量水问题

    题目详情

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

    解题思路

    这是一个典型的倒水问题/量水问题,使用欧几里得算法就可解出来。
     
    这里有一篇文章给出了简单的倒水问题的解法,可以解决笔试面试里面一些简单的填空题,可以看一看:http://blog.csdn.net/morewindows/article/details/7481851
    基本思想是:不断用小桶装水倒入大桶,大桶满了立即清空,每次判断下二个桶中水的容量是否等于指定容量。也就是用小桶容量的倍数对大桶的容量进行取余,直到余数等于指定容量。
    例如,用7升的桶和11升的桶得到2升水可以这样做:
    7 % 11 = 7
    14 % 11 = 3
    21 % 11 = 10
    28 % 11 = 6
    35 % 11 = 2  成功得到2升水。
    对于明确说明可以得到xx升水,需要我们给出如何倒出来的步骤,可以用这个方法,很快捷。但是这个方法不适合解这道题。
     
    欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。
    用gcd(a,b) 表示a, b的最大公约数,则有定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)
    具体的算法实现有循环和递归两种,我用的是循环的方法。
     
    扩展欧几里得算法
    定理:对于不完全为 0 的非负整数 a,b,gcd(a, b)表示 a, b 的最大公约数,必然存在整数对 x, y ,使得 gcd(a,b)=ax+by。
     
    本题实际上是问是否存在整数x, y,使得ax+by=c成立。如果c可以被gcd(a,b)整除,则成立。
     
    因此解题步骤如下:
    1. 求出gcd(a,b)
    2. 判断c是否能被gcd(a,b)整除,若能则返回true,否则返回false

    Java代码

    复制代码
     1 public static boolean can(int a,int b,int c) {
     2     int r;
     3     while (true) {
     4         r = a % b;
     5         if (r != 0) {
     6             a = b;
     7             b = r;
     8         } else {
     9             break;
    10         }
    11     } 
    12     return c%b == 0;    //b现在是最大公约数,若c能被b整除,则可以
    13 }
    复制代码
     
     
     
    标签: 算法
  • 相关阅读:
    PHP数字签名算法
    PHP日期相关类
    浏览器常见bug及解决办法
    PHPer整理的前端开发知识
    小程序之轮播图(2020.4.13更新)
    Android APK反编译 apktool使用教程
    秒懂-单列布局水平居中布局
    一句话搞定-phpStudy安装yaf扩展
    Git的简单安装
    人人都能读懂的css3 3d小demo
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3396398.html
Copyright © 2020-2023  润新知