zoukankan      html  css  js  c++  java
  • sql server编写脚本求解第1天1分钱之后每天两倍持续一个月的等比数列问题

    一、问题

    • 问题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倍的倍数,一个月多少钱?
    • 0.01每天翻倍30天是多少
    • 0.01每天翻倍月底多少钱
    • 0.01每天翻一倍

    三、解题方法

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

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

      /*
          作者:zhang502219048
          脚本来源:https://www.cnblogs.com/zhang502219048/p/11273639.html
          功能:通过while循环实现计算1分钱翻倍1个月的问题
      */
      --定义变量
      declare @a decimal(18,2) = 0.01,   --@a为每天多少钱,初始为第1天0.01元
              @total decimal(18,2) = 0,  --@total为截至当天总共多少钱
              @q int = 2,                --@q为每天翻多少倍
              @n int = 2,                --@n为第几天,而且是从第2天开始,因为是第2天才开始翻倍
              @nMax int = 30             --@nMax为最后翻倍的那天
      
      --while循环,计算到第30天,当天多少钱和截至当天总共多少钱
      while @n <= @nMax                  --从第2天开始进行循环,直到第30天
      begin
          select @a = @a * @q            --计算当天多少钱
          select @total = @total + @a    --计算截至当天总共多少钱
          select @n = @n + 1             --循环变量@n加1天
      end
      
      --输出信息
      print '第30天多少钱:'
      print @a
      print '第1到30天总共多少钱:'
      print @total
      go

      1.2 脚本运行结果:

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

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

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

      2.3 脚本运行结果:

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

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

      3.2 脚本运行结果:

    四、问题结论

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

    五、问题扩展

    六、作者声明

  • 相关阅读:
    实现斐波那契数列的三种方式
    [LintCode]计算两个数的交集(二)
    [LintCode]计算两个数的交集(一)
    JNI技术概念小结
    require.js的用法
    JavaScript中模块“写法”
    模块化的JavaScript
    javascript如何判断访问网页的设备及是否支持触屏功能
    Javascript自由拖拽类
    JQuery中html()方法的注意事项
  • 原文地址:https://www.cnblogs.com/zhang502219048/p/11273639.html
Copyright © 2011-2022 走看看