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公用表达式递归方式。大家可以参考学习一下博主写的脚本。
使用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
go1.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
go2.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:截至当天总共多少钱)
go3.2 脚本运行结果:

四、问题结论
- 第30天给5,368,709.12元(五百多万)!
- 截至第30天总共给10,737,418.23元(一千多万)!
五、问题扩展
- 等比数列产生的背景故事——棋盘放麦粒,具体大家可以直接查看百度百科,这里就不再详述。
- CTE公用表达式生成连续数字或日期,可以看看博主写的另一篇博文《sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期》
六、作者声明
- 欢迎转载,但转载请务必注明博文来源:
- https://www.cnblogs.com/zhang502219048/p/11273639.html (sql server版)
- https://www.cnblogs.com/zhang502219048/p/12822913.html (Python版)
sql server编写脚本求解第1天1分钱之后每天两倍持续一个月的等比数列问题的更多相关文章
- Python编程求解第1天1分钱之后每天两倍持续一个月的等比数列问题
一.问题 问题1 场景:如果你未来的丈母娘要求你,第1天给她1分钱,第2天给2分钱,第3天给4分钱,以此类推,每天给前一天的2倍,给1个月(按30天)算就行.问:第30天给多少钱,总共给多少钱? 问题 ...
- Sql Server中查询当天,最近三天,本周,本月,最近一个月,本季度的数据的sql语句
--当天: --最近三天: --本周: select * from T_news WHERE (DATEPART(wk, addtime) = DATEPART(wk, GETDATE())) AND ...
- sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)
问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...
- sql server编写通用脚本自动统计各表数据量心得
工作过程中,如果一个数据库的表比较多,手工编写统计脚本就会比较繁琐,于是摸索出自动生成各表统计数据量脚本的通用方法,直接上代码: /* 脚本来源:https://www.cnblogs.com/zha ...
- 一行导出所有任意微软SQL server数据脚本-基于Python的微软官方mssql-scripter工具使用全讲解
文章标题: 一行导出所有任意微软SQL serer数据脚本-基于Python的微软官方mssql-scripter工具使用全讲解 关键字 : mssql-scripter,SQL Server 文章分 ...
- ola.hallengren的SQL Server维护脚本
ola.hallengren的SQL Server维护脚本 下载地址 http://files.cnblogs.com/files/lyhabc/ola.hallengrenMaintenanceSo ...
- 非常全面的SQL Server巡检脚本来自sqlskills团队的Glenn Berry 大牛
非常全面的SQL Server巡检脚本来自sqlskills团队的Glenn Berry 大牛 Glenn Berry 大牛会对这个脚本持续更新 -- SQL Server 2012 Diagnost ...
- SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数
原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...
- 非常全面的SQL Server巡检脚本来自sqlskills团队的Glenn Berry
非常全面的SQL Server巡检脚本来自sqlskills团队的Glenn Berry Glenn Berry 曾承诺对这个脚本持续更新 -- SQL Server 2012 Diagnostic ...
随机推荐
- Java修炼——面向对象_抽象类和抽象方法
抽象类和抽象方法 什么是抽象类? 使用 abstract 修饰的类称为抽象类 public abstract class Person { } 抽象类的特征 1) 抽象类不可以创建对象 2) 抽象类可 ...
- GlusterFS 存储
GlusterFS简介: 互联网四大开源分布式文件系统分别是:MooseFS.CEPH.Lustre.GusterFS. GluterFS最早由Gluster公司开发,其目的是开发一个能为客户提供全局 ...
- 适用于Java开发人员的SOLID设计原则简介
看看这篇针对Java开发人员的SOLID设计原则简介.抽丝剥茧,细说架构那些事——[优锐课] 当你刚接触软件工程时,这些原理和设计模式不容易理解或习惯.我们都遇到了问题,很难理解SOLID + DP的 ...
- 使用iCamera 白平衡调试小结 CC1603@AR0134
使用iCamera 白平衡调试小结 CC1603@AR0134 iCamera有强大的各种摄像头调试功能 之前演示过的有:曝光.增益.各种寄存器测试.RAW.yuv输出 今天测试下白平衡功能 绝大多数 ...
- 每周一练 之 数据结构与算法(Set)
这是第四周的练习题,五一放假结束,该收拾好状态啦. 下面是之前分享的链接: 1.每周一练 之 数据结构与算法(Stack) 2.每周一练 之 数据结构与算法(LinkedList) 2.每周一练 之 ...
- 【Java】在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...
- .NET Core依赖注入集成Dynamic Proxy
在<Castle DynamicProxy基本用法>中介绍了如何将DP与Autofac集成使用,而 .NET Core有自己的依赖注入容器,在不依赖第三方容器的基础上,如何实现动态代理就成 ...
- LeetCode刷题总结-栈、链表、堆和队列篇
本文介绍LeetCode上有关栈.链表.堆和队列相关的算法题的考点,推荐刷题20道.具体考点分类如下图: 一.栈 1.数学问题 题号:85. 最大矩形,难度困难 题号:224. 基本计算器,难度困难 ...
- 用函数式编程,从0开发3D引擎和编辑器(三):初步需求分析
大家好,本文介绍了Wonder的高层需求和本系列对应的具体功能点. 确定Wonder高层需求 业务目标 Wonder是web端3D开发的解决方案,包括引擎.编辑器,致力于打造开放.分享.互助的生态. ...
- 批量SSH key-gen无密码登陆认证脚本
SSH key-gen无密码登录认证脚本 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 通过 ssh-key-gen 来 ...