【紅目香薰
🤗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:
我這裡不使用歐幾裡得定理,咱們一步步分析。
沒有通分,使用浮點數記性計算,最終出現浮點數計算錯誤,無法精準答案。
由于答案肯定是整數,是以最後取整即可。
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));
}
}
編碼分析2:(算法更新,難度提升到40題附近,可以先略過,後面也會有對歐幾裡得定理的具體拆分式講解)
這個題需要一定的數學基礎,起碼會通分。
樣例:
最小公分母=2*5*3*2*1*5=300
那麼,20與16頁一樣
也可以:
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;
}
}