用range函数解码高斯等差数列求和

小时候就听过的一个故事是,高斯10岁的时候算出老师布特纳给学生们出的将1加到100求和的问题,并且布特纳刚叙述完题目,高斯就算出了正确答案。
不过据对高斯素有研究的著名数学史家贝尔考证,
布特纳当时出的是一道更难的加法题:81297+81495+81693+……+100899。
当然这也是一个等差数列求和问题(公差为198,项数为100),但更能反映高斯从小就注意把握更本质的数学方法这一特点。
贝尔写道,高斯晚年的时候经常向人们谈论这件事,说当时只有他写的答案是正确的。
高斯没有明确的讲过,他是用什么方法做的。
而数学史家们倾向于认为,高斯当时已经掌握了等差数列求和的方法。

我搜索了等差数列求和的方法:

  • 等差数列基本公式:
    末项 =首项+(项数-1)× 公差
    项数 =(末项首项)÷ 公差 +1
    首项=末项-(项数-1)× 公差
    =(首项+末项项数 ÷2

按照数学公式

a1 = 1
an = 100
n =100
d = 1 #(d为公差)
Sn1=(a1+an)*n/2 
Sn2=n*a1+n*(n-1)*d/2
print('Sn1公式的的值是{};'.format(Sn1))
print('Sn2公式的的值是{};'.format(Sn2))
[OUT]
Sn1公式的的值是5050.0;
Sn2公式的的值是5050.0;

这个公式要算项数,不符合简便原则,那如何更简便的去算等差数列的和,可以怎么计算呢?
用for +range函数遍历数值,
range(a,b,c),
a = 首项
b = 末项+1
c = 公差(默认值=1)
比如,求1到100的和

s = 0
for i in range(1,101,1):
    s +=  i
#高斯
print('{}{}'.format('我是等差数列,求和等于:',s))
[OUT]我是等差数列,求和等于:5050

是不是很神奇,我们用等差数列求和公式算一下,1到100的求和也是5050.那我们来观察下s +=i 的计算原理用小数字测试下

s = 0
n = 0 
for i in range(1,6):
    n +=1
    s = s + i
    print('第{}轮'.format(n))
    print('{}的值是{};'.format('i',i),end='')
    print('{}的值是{};'.format('s',s),end='')
    print('{}的值是{};'.format('s =s + i',s+i))

print('{}{}'.format('我是等差数列,最终求和等于:',s))

[OUT]
第1轮
i的值是1;s的值是1;s =s + i的值是2;
第2轮
i的值是2;s的值是3;s =s + i的值是5;
第3轮
i的值是3;s的值是6;s =s + i的值是9;
第4轮
i的值是4;s的值是10;s =s + i的值是14;
第5轮
i的值是5;s的值是15;s =s + i的值是20;
我是等差数列,最终求和等于:15

根据print(i)和print(s)的值输出,可以看出i是遍历数值区间,s的值是之前的i值叠加,最终求和.
现在高斯的81297+81495+81693+……+100899。会用range函数求了吗?
公差是198,要代入进去哦

s = 0
for i in range(81297,100900,198):
    s = s + i

#高斯
print('{}{}'.format('我是等差数列,求和',s))
print((81297+100899)*100/2)
[out]
我是等差数列,求和9109800
9109800.0

你学会了吗?等差数列求和,range函数不用算项数更加简便.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值