問題:第1天給丈母娘1分錢,第2天給2分錢,第3天給4分錢,以此類推,每天給前一天的2倍,給一個月(按30天)算就行。問:第30天給多少錢,總共給多少錢? 解決方案:1)while迴圈方法(不推薦)一般思維可能就會定義一些變數,然後通過while進行迴圈,腳本會比較繁瑣。這種方法大部分人都能想到,即 ...
一、問題
-
問題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公用表達式遞歸方式。大家可以參考學習一下博主寫的腳本。
-
使用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 腳本運行結果:
-
使用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 腳本運行結果:
-
使用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元(一千多萬)!
五、問題擴展
- 等比數列產生的背景故事——棋盤放麥粒,具體大家可以直接查看百度百科,這裡就不再詳述。
- CTE公用表達式生成連續數字或日期,可以看看博主寫的另一篇博文《sql server使用公用表表達式CTE通過遞歸方式編寫通用函數自動生成連續數字和日期》
六、作者聲明
- 歡迎轉載,但轉載請務必註明博文來源:https://www.cnblogs.com/zhang502219048/p/11273639.html