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元(一千多萬)!

五、問題擴展

六、作者聲明


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM