小时候就听过的一个故事是,高斯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函数不用算项数更加简便.