天天看點

基礎算法練習200題09、水池注水

基礎算法練習200題09、水池注水

【紅目香薰

🤗2022年最大願望:【服務百萬技術人次】🤗

      為了幫助很多想搞算法但又害怕自己搞不定的孩子們,老師付準備了200個入門的邏輯練習題,在這200個邏輯練習題下可以加強你們的基礎算法能力,以次為基礎當面對正式的算法題目的時候可以得心應手的面對。 

題目:

甲乙兩個水管單獨開,注滿一池水,分别需要20小時,16小時。丙水管單獨開,排一池水要10小時,若水池沒水,同時打開甲乙兩水管,5小時後,再打開排水管丙,問水池注滿還需要多少小時?

題解:

甲功率=1/20(進水)

乙功率=1/16(進水)

丙功率=1/10(排水)

通分一下:

一眼就看出來公分母是80。甲是4/80,乙是5/80,丙是8/80

可以看出,甲乙之和是9/80與丙8/80進行計算。

題目說是先開甲乙5小時,也就是,(9/80)*5,咱們不依然使用80這個分母等于45/80。

隻需要計算出剩餘的35是如何填充的即可。

已知甲乙之和與丙比較多出1/80。

故而,開啟甲乙5小時後打開丙排水,需要時間35小時即可。

編碼分析1:

我這裡不使用歐幾裡得定理,咱們一步步分析。

沒有通分,使用浮點數記性計算,最終出現浮點數計算錯誤,無法精準答案。

基礎算法練習200題09、水池注水

由于答案肯定是整數,是以最後取整即可。

package com.item.action;

/**
 * 
 * @author hongmuxiangxun 紅目香薰 付文龍 老師付 laoshifu
 *
 */
public class demo9 {
  public static void main(String[] args) {
    double a=20;
    double b=16;
    double c=10;
    double five=(1/a+1/b)*5;
    double last=(1/a+1/b-1/c);
    double result=(1-five)/last;
    System.out.println(String.format("%.0f", result));
  }
}      
基礎算法練習200題09、水池注水

編碼分析2:(算法更新,難度提升到40題附近,可以先略過,後面也會有對歐幾裡得定理的具體拆分式講解)

這個題需要一定的數學基礎,起碼會通分。

樣例:

基礎算法練習200題09、水池注水
最小公分母=2*5*3*2*1*5=300

那麼,20與16頁一樣

基礎算法練習200題09、水池注水

也可以:

20=2*2*5

16=2*2*2*2

都是質因數,那個數量多選按個,相乘即可。

最小公倍數=2*2*2*2*5=80

這裡套用歐幾裡得定理直接出結果:

package com.item.action;

/**
 * 
 * @author hongmuxiangxun 紅目香薰 付文龍 老師付 laoshifu
 *
 */
public class demo9_1 {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("最大公約數:"+gcd(2, 16));
    System.out.println("最小公倍數:"+lcm(20, 16));
  }

  /**
   * 
   * 最大公約數
   * @param x
   * @param y
   * @return
   */
  public static int gcd(int x, int y) {
    if (y == 0) {
      return x;
    }
    return gcd(y,x%y);
  }
  /**
   * 最小公倍數·此寫法對于比較大的數處理較好
   * @param x
   * @param y
   * @return
   */
  public static int lcm(int x, int y) {
    int gcd = gcd(x, y);
    return (x / gcd) * (y / gcd) * gcd;
  }

}      
package com.item.action;

/**
 * 
 * @author hongmuxiangxun 紅目香薰 付文龍 老師付 laoshifu
 *
 */
public class demo9_1 {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    //通分後的最小公倍數就可以當做水池的總機關:lcm
    int lcm = lcm(20, 16);
    //計算前5小時總水量
    int five=(lcm/20+lcm/16)*5;
    //剩餘水池空間lcm-five
    int last=lcm-five;
    //計算5小時後的功率
    int power=lcm/20+lcm/16-lcm/10;
    //剩餘空間/功率=最後消耗時間
    int result=last/power;
    System.out.println(result);
  }

  /**
   * 
   * 最大公約數
   * @param x
   * @param y
   * @return
   */
  public static int gcd(int x, int y) {
    if (y == 0) {
      return x;
    }
    return gcd(y,x%y);
  }
  /**
   * 最小公倍數·此寫法對于比較大的數處理較好
   * @param x
   * @param y
   * @return
   */
  public static int lcm(int x, int y) {
    int gcd = gcd(x, y);
    return (x / gcd) * (y / gcd) * gcd;
  }

}