• 基础算法练习200题09、水池注水



    📋前言📋
    💝博客:【红目香薰的博客_CSDN博客-计算机理论,2022年蓝桥杯,MySQL领域博主】💝

    ✍本文由在下【红目香薰】原创,首发于CSDN✍

    🤗2022年最大愿望:【服务百万技术人次】🤗

    💝专栏地址:【https://blog.csdn.net/feng8403000/category_11958599.html】💝 


          为了帮助很多想搞算法但又害怕自己搞不定的孩子们,老师付准备了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:

    我这里不使用欧几里得定理,咱们一步步分析。

    没有通分,使用浮点数记性计算,最终出现浮点数计算错误,无法精准答案。

    由于答案肯定是整数,所以最后取整即可。

    1. package com.item.action;
    2. /**
    3. *
    4. * @author hongmuxiangxun 红目香薰 付文龙 老师付 laoshifu
    5. *
    6. */
    7. public class demo9 {
    8. public static void main(String[] args) {
    9. double a=20;
    10. double b=16;
    11. double c=10;
    12. double five=(1/a+1/b)*5;
    13. double last=(1/a+1/b-1/c);
    14. double result=(1-five)/last;
    15. System.out.println(String.format("%.0f", result));
    16. }
    17. }

    编码分析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

    这里套用欧几里得定理直接出结果:

    1. package com.item.action;
    2. /**
    3. *
    4. * @author hongmuxiangxun 红目香薰 付文龙 老师付 laoshifu
    5. *
    6. */
    7. public class demo9_1 {
    8. public static void main(String[] args) {
    9. // TODO Auto-generated method stub
    10. System.out.println("最大公约数:"+gcd(2, 16));
    11. System.out.println("最小公倍数:"+lcm(20, 16));
    12. }
    13. /**
    14. *
    15. * 最大公约数
    16. * @param x
    17. * @param y
    18. * @return
    19. */
    20. public static int gcd(int x, int y) {
    21. if (y == 0) {
    22. return x;
    23. }
    24. return gcd(y,x%y);
    25. }
    26. /**
    27. * 最小公倍数·此写法对于比较大的数处理较好
    28. * @param x
    29. * @param y
    30. * @return
    31. */
    32. public static int lcm(int x, int y) {
    33. int gcd = gcd(x, y);
    34. return (x / gcd) * (y / gcd) * gcd;
    35. }
    36. }

    取整计算可以消除浮点数运算丢失精度的问题:

    1. package com.item.action;
    2. /**
    3. *
    4. * @author hongmuxiangxun 红目香薰 付文龙 老师付 laoshifu
    5. *
    6. */
    7. public class demo9_1 {
    8. public static void main(String[] args) {
    9. // TODO Auto-generated method stub
    10. //通分后的最小公倍数就可以当做水池的总单位:lcm
    11. int lcm = lcm(20, 16);
    12. //计算前5小时总水量
    13. int five=(lcm/20+lcm/16)*5;
    14. //剩余水池空间lcm-five
    15. int last=lcm-five;
    16. //计算5小时后的功率
    17. int power=lcm/20+lcm/16-lcm/10;
    18. //剩余空间/功率=最后消耗时间
    19. int result=last/power;
    20. System.out.println(result);
    21. }
    22. /**
    23. *
    24. * 最大公约数
    25. * @param x
    26. * @param y
    27. * @return
    28. */
    29. public static int gcd(int x, int y) {
    30. if (y == 0) {
    31. return x;
    32. }
    33. return gcd(y,x%y);
    34. }
    35. /**
    36. * 最小公倍数·此写法对于比较大的数处理较好
    37. * @param x
    38. * @param y
    39. * @return
    40. */
    41. public static int lcm(int x, int y) {
    42. int gcd = gcd(x, y);
    43. return (x / gcd) * (y / gcd) * gcd;
    44. }
    45. }

  • 相关阅读:
    Kafka 万亿级消息实践之资源组流量掉零故障排查分析
    工业用PID调节器实现0.1%超高精度控制的关键指标分析
    【Java】replace替换方法
    使用U3D、pico开发VR(二)——添加手柄摇杆控制移动
    【Dockerfile镜像实战】构建LNMP环境并运行Wordpress网站平台
    一文学会Spring JDBC 使用
    C# 二十年语法变迁之 C#9参考
    解决 npm install 报错的问题
    Boost ASIO :I/O Services and I/O Objects
    《Unity Shader 入门精要》笔记07
  • 原文地址:https://blog.csdn.net/feng8403000/article/details/126291492