经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
sql server编写脚本求解第1天1分钱之后每天两倍持续一个月的等比数列问题
来源:cnblogs  作者:张工502219048  时间:2019/8/2 8:45:59  对本文有异议

一、问题

  • 问题1

    场景:如果你未来的丈母娘要求你,第1天给她1分钱,第2天给2分钱,第3天给4分钱,以此类推,每天给前一天的2倍,给1个月(按30天)算就行。
    问:第30天给多少钱,总共给多少钱?
  • 问题2

    场景:如果有两份工作。
       第1份:第1天给你1分钱,第2天给你2分钱,第3天给你4分钱,以此类推,每天给前一天的2倍,给1个月(按30天)。
       第2份:一个月给你10万工资。
    问:哪份工资高?给你选择的话,你要第1份还是第2份?

二、相关热搜关键词

  • 1天1分钱翻倍累计到三十天后多少钱
  • 1天1分钱第二天乘2
  • 1天1分钱每天翻2倍30天一共多少钱
  • 1天1分钱2天2分钱3天4分钱
  • 1天1分钱2天2分钱,以2倍的倍数,一个月多少钱?

三、解题方法

  问题1和问题2,其实计算是一样的,在这里博主为大家介绍三种不同的解题方法,分别为:通过while循环方式、power函数结合等比数列通项和求和公式、CTE公用表达式递归方式。大家可以参考学习一下博主写的脚本。

  1. 使用while循环方式
    1.1 直接看脚本和相关注释:

    1. /*
    2. 作者:zhang502219048
    3. 脚本来源:https://www.cnblogs.com/zhang502219048/p/11273639.html
    4. 功能:通过while循环实现计算1分钱翻倍1个月的问题
    5. */
    6. --定义变量
    7. declare @a decimal(18,2) = 0.01, --@a为每天多少钱,初始为第10.01
    8. @total decimal(18,2) = 0, --@total为截至当天总共多少钱
    9. @q int = 2, --@q为每天翻多少倍
    10. @n int = 2, --@n为第几天,而且是从第2天开始,因为是第2天才开始翻倍
    11. @nMax int = 30 --@nMax为最后翻倍的那天
    12.  
    13. --while循环,计算到第30天,当天多少钱和截至当天总共多少钱
    14. while @n <= @nMax --从第2天开始进行循环,直到第30
    15. begin
    16. select @a = @a * @q --计算当天多少钱
    17. select @total = @total + @a --计算截至当天总共多少钱
    18. select @n = @n + 1 --循环变量@n1
    19. end
    20.  
    21. --输出信息
    22. print '第30天多少钱:'
    23. print @a
    24. print '第1到30天总共多少钱:'
    25. print @total
    26. go

    1.2 脚本运行结果:

  2. 使用power函数和等比数列通项和求和公式
    2.1 先来看看等比数列通项公式和求和公式是怎样的,学习一下:

    2.2 直接看脚本和相关注释:

    1. /*
    2. 作者:zhang502219048
    3. 脚本来源:https://www.cnblogs.com/zhang502219048/p/11273639.html
    4. 功能:通过power函数和等比数列求和公式实现计算1分钱翻倍1个月的问题
    5. */
    6. --定义变量
    7. declare @a1 decimal(18,2) = 0.01, --@a1为第10.01
    8. @a30 decimal(18,2), --@a30为第30天多少钱
    9. @total decimal(18,2), --@total为截至当天总共多少钱
    10. @q int = 2, --@q为每天翻多少倍
    11. @n int = 30 --@n为总共几天
    12.  
    13. --使用power函数结合等比数列通项公式,计算第30天多少钱
    14. select @a30 = @a1 * power(@q, @n - 1) --power(@q, @n - 1):使用power函数计算@q@n - 1次方
    15. --使用等比数列求和公式,计算截至第30天总共多少钱
    16. select @total = (@a1 - @a30 * @q)/(1 - @q)
    17. --输出信息
    18. print '第30天多少钱:'
    19. print @a30
    20. print '第1到30天总共多少钱:'
    21. print @total
    22. go

    2.3 脚本运行结果:

  3. 使用CTE公用表达式递归方式
    3.1 直接看脚本和相关注释:

    1. /*
    2. 作者:zhang502219048
    3. 脚本来源:https://www.cnblogs.com/zhang502219048/p/11273639.html
    4. 功能:通过CTE递归方式实现计算1分钱翻倍1个月的问题
    5. 字段说明:DayX为第几天,MoneyX为当天多少钱,MoneyTotal为截至当天总共多少钱
    6. */
    7.  
    8. with cte_table(DayX, MoneyX, MoneyTotal) as
    9. (
    10. select 1
    11. , cast(0.01 as decimal(18,2)) --1天当天0.01
    12. , cast(0.01 as decimal(18,2)) --截至第1天当天总共0.01
    13. union all
    14. select DayX + 1 --DayX1
    15. , cast(MoneyX * 2 as decimal(18,2)) --DayX + 1天当天多少钱
    16. , cast(MoneyTotal + MoneyX * 2 as decimal(18,2)) --截至第DayX + 1天当天总共多少钱
    17. from cte_table
    18. where DayX < 30 --计算到第30天截止,结束递归
    19. )
    20. select * from cte_table --查看明细数据(DayX:第几天;MoneyX:当天多少钱;MoneyTotal:截至当天总共多少钱)
    21. go

    3.2 脚本运行结果:

四、问题结论

  • 第30天给5,368,709.12元(五百多万)!
  • 截至第30天总共给10,737,418.23元(一千多万)!

五、问题扩展

六、作者声明

原文链接:http://www.cnblogs.com/zhang502219048/p/11273639.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号