• JAVA 递归算法- 椰子汁5元一瓶,4个盖子可以换一瓶椰子汁,3个空瓶可以换一瓶椰子汁,那么 100 块钱可以喝多少瓶椰子汁,剩下瓶盖和空瓶各多少?


    目录

    原题展示

    做表理思路

    当初始汽水为3瓶时

    当初始汽水为4瓶时

    分析提取数据逻辑

    瓶子的个数的计算

    盖子的个数的计算

    汽水数目的计算

    取模运算

    源代码

    成功截图


    原题展示

    椰子汁5元一瓶,4个盖子可以换一瓶椰子汁,3个空瓶可以换一瓶椰子汁,那么 100 块钱可以喝多少瓶椰子汁,剩下瓶盖和空瓶各多少?

    做表理思路

    当初始汽水为3瓶时

    瓶子

    3

    1

    2

    盖子

    3

    4

    1

    汽水

    3

    4

    5

    具体就是

    瓶子

    3

    3/3+3%3+3/4=1

    1/3+1%3+4/4=0+1+1=2

    盖子

    3

    3/4+3%4+3/3=0+3+1=4

    4/4+4%4+1/3=1+0+0=1

    汽水

    3

    3+3/3+3/4=4

    4+1/3+4/4=5

    当初始汽水为4瓶时

    瓶子

    4

    3

    1

    盖子

    4

    2

    3

    汽水

    4

    6

    7

    具体就是

    瓶子

    4

    4/3+4%3+4/4=3

    3/3+3%3+2/4=1

    盖子

    4

    4/4+4%4+4/3=2

    2/4+2%4+3/3=0+2+1=3

    汽水

    4

    4+4/3+4/4=6

    6+3/3+2/4=7

    分析提取数据逻辑

    相信经过上面4个表格的运算逻辑已经十分明显了!!

    接下来我们将逻辑好好理理就可以写代码了,其中我们先算瓶子个数

    瓶子的个数的计算

    先用瓶子的当前数量除以3,再加上瓶子的当前数量模3,再加上盖子的当前数量除以4。

    为什么要这样写呢?

    很简单因为当瓶子数量改变的时候,盖子数量也会改变,所以才有了最后那一句盖子的数量除以4如果这个值大于1说明这又可以换水了,如果可以换水也就是说瓶子的数目也会再次改变了!

    所以我们需要加上后面那一句这很重要!

    再往前面分析一下,为什么要用当前瓶子的数目模3呢?

    答案很简单为了算出当前瓶子在兑换汽水后我们还剩下的瓶子数目,因为这是一个动态变化的过程呀!

    其实这边也可以写为当前的汽水数目去模我们的3,结果都是一样的!

    再往前为什么要用瓶子数除以3呢?

    相信这个都很好理解,就是算出当前瓶子的个数能够换取多少瓶汽水,。

    OK总理一下逻辑。

    瓶子的当前个数=瓶子能够换取的汽水个数+瓶子剩余的个数再+盖子能够换取汽水的数目。

    1. int tempcap=cap/4;
    2. int tempbottle=bottle/3;
    3. bottle=tempbottle+tempcap+drink%3;

    由此上面的逻辑式子,就一目了然了

    盖子的个数的计算

    以此类推盖子的数目也可以算出来

    1. int tempcap=cap/4;
    2. int tempbottle=bottle/3;
    3. cap=tempcap+tempbottle+drink%4;

    汽水数目的计算

    最后就是当前汽水的数目这个更好理解

    当前汽水的数目=原来汽水的数目+瓶子能够换取的汽水数目+盖子能换取的汽水数目

    1. int tempcap=cap/4;
    2. int tempbottle=bottle/3;
    3. drink=drink+tempcap+tempbottle;

    取模运算

    最后补充一点就是取模运算,请问2模3结果是多少?
    答案是2,很多人以为答案是一这是一个易错点,容易自己把自己给搞糊涂

    我们还是先写出平常数据

    假如3/2,模是1;(减去2的倍数2,剩下1)
    假如5/2,模是1;(减去2的倍数4,剩下1)
    假如8/3,模是2; (减去3的倍数6,剩下2)

    那么我们就可以总结出来,2%3的过程是(2减去3的0倍,剩下2)故答案是2

    源代码

    1. import java.util.Scanner;
    2. public class Main {
    3. public static void main(String[] args)
    4. {
    5. Scanner input=new Scanner(System.in);
    6. System.out.println("请输入价钱");
    7. int initsum=input.nextInt()/5;
    8. getDrink(initsum,initsum,initsum);
    9. }
    10. public static int getDrink(int drink,int cap,int bottle)
    11. {
    12. if(cap<4&&bottle<3)
    13. {
    14. System.out.printf("结果是如下:\n剩余盖子:%d 剩余瓶子:%d 剩余汽水:%d\n",cap,bottle,drink);
    15. return 0;
    16. }
    17. else {
    18. int tempcap=cap/4;
    19. int tempbottle=bottle/3;
    20. cap=tempcap+tempbottle+cap%4;
    21. bottle=tempbottle+tempcap+bottle%3;
    22. //这样写也可以
    23. //cap=tempcap+tempbottle+drink%4;
    24. //bottle=tempbottle+tempcap+drink%3;
    25. drink=drink+tempcap+tempbottle;
    26. System.out.printf("当前盖子:%d 当前瓶子:%d 当前汽水:%d\n",cap,bottle,drink);
    27. return getDrink(drink,cap,bottle);
    28. }
    29. }
    30. }

    成功截图

  • 相关阅读:
    ClickHouse查看执行计划
    python - random模块随机数常用方法
    [每周一更]-(第22期):什么是gRPC?
    配置tomcat可用的代理访问ArcGIS Enterprise/GeoScene Enterprise加密服务
    大数据可视化——Sqoop与Hive的安装详解
    Requests库
    别再用 System.currentTimeMillis 统计耗时了,太垃圾了,这个工具类好用到牛炸天了!
    绘图问题记录
    react跳转页面redux数据被清除
    【数据结构与算法】之深入解析“安排邮筒”的求解思路与算法示例
  • 原文地址:https://blog.csdn.net/qq_53679247/article/details/127522504