使用推土机算法
这是一道很简单的数学题,求自然数1到100的累加和。

有些同学可能会使用推土机算法。推土机算法是一种比较笨拙的算法,算法就像推土机一样,再多的土方,都是一铲一铲的来,直至把所有要处理的土方全部处理完毕,不讲究效率。

下面是计算从1加到100的推土机算法:
1+2+3+……+99+100 = 5050

推土机算法是最直接的算法,从1开始一直加到100,同学们只要有足够的认真和耐心,是完全可以完成整个从自然数1到100求累加和计算过程的。
使用简便算法

可以把算式:
1+2+3+……+99+100
利用加法结合律,写成如下的算式:
(1+100)+(2+99)+……+(49+52)+(50+51)

在上面的算式中,利用加法结合律,可以将1与100、2与99、3与97、……、49与52、50与51进行两两组合相加,这样的两两组合一共有50对。再仔细观察,我们发现每一组合的两个数的和都等于101。

基于上面的观察结果,可以把上面的算式改写为:
(1+100)* 50 = 5050
这个算式就是从1加到100的简便算法,计算效率比推土机算法效率要快得多。

用Python求自然数1到100的累加和

使用Python语言来求自然数1到100的累加和,也涉及到是使用推土机算法还是简便算法。如果使用简便算法,程序代码非常简单。


在Python代码中,写如下的算式,显然不是好的方式。一行代码过长,既不方便阅读,代码结构也不清晰。

案例02代码中的省略号表示从4累加到98。
可以考虑声明一个sum变量,sum变量的初始值为0,让sum变量从1开始,一直加到100。加法算式可以使用“+=”运算符,“+=”运算符将运算符左边的操作数与右边操作数的值相加后,再赋值给运算符左边的操作数。

上述语句执行后,sum的值为3,执行过程为:
(1)sum初始值为0;
(2)执行sum+=1语句,sum自身的值加上1再赋值给sum,此时sum的值为1;
(3)执行sum+=2语句,sum自身的值加上2再赋值给sum,此时sum的值为3。
计算从1加到100的推土机算法流程图:

上面流程图的计算过程并没有完全绘制出来,仅绘制了sum+1和sum+100的过程步骤,用省略号“……”表示了sum从2加到99的过程步骤。这是因为绘制这么多的过程步骤太麻烦了,既费时间又没有多大用处,流程图也不直观。
有了流程图,就要开始写Python代码了。流程图可以用省略号表示sum从2加到99的过程步骤,但在代码中不能忽略,需要写100条类似下面的语句:

没办法,我还是用了省略号“……”,不然正在阅读的你都不同意。
认识for循环结构

Python语言提供了一种循环结构,可以快速有效地执行重复性操作,使用循环结构可以解决上面要写100条重复语句的问题。
循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,重复执行语句块(一个语句块包含多条语句,也可以是一条语句),直到条件不成立为止。给定的条件称为循环条件,反复执行的语句块称为循环体。

Python提供了for循环和while循环两种循环结构体,这节课主要讲述for循环结构体,并使用for循环结构求自然数1到100的累加和。

设sum变量的初始值为0,求自然数1到100的累加和,需要循环执行100条下面的语句:
sum += n

其中,sum是存储累加和的变量,n的取值范围是自然数1到100,初始值为1,每次循环递增1。例如:
第1次循环时,n的值为1。
第2次循环时,n的值为2。
……
第100次循环时,n的值为100。

Python的for循环结构,通过一个序列(sequence)来控制循环,循环次数由序列的元素数目决定。一个序列是有序排列的多个元素,可以通过元素所在序列的位置(索引)来访问每个元素。
for循环结构的语法为:

其中,for……in是for循环结构的语句,在for和in之间的iterating_var为循环变量,用来接收序列对象的元素。在in后面是序列对象,一个序列在Python中也称为序列对象。例如:前面学过的字符串就是一个序列对象,字符串中的每个字符就是序列中的元素,这些字符在字符串中有序排列。后面将要学习的列表、元组等都是序列对象。
sequence内的元素数目决定了循环次数,如果sequence是一个空序列,for循环不会被执行,循环体内语句也不会被执行。
如果sequence是非空序列,for循环初始化时,会把sequence的第一个元素赋值给iterating_var。然后执行条件判断,判断iterating_var是否在sequence内,如果是就执行循环体内的语句,否则就退出循环。
循环体内的语句块执行完成后,for循环会把sequence的下一个元素赋值给iterating_var,如果sequence的下一个元素为None(None是Python定义的关键字,表示空值),此时iterating_var也为None。再次进入条件判断,判断iterating_var是否在sequence内,如果是就执行循环体内的语句,否则就退出循环。
要实现求100以内累加和的循环算法,需要创建一个整数序列,一个整数序列就是一组有序的整数,如1、2、3、4、5、6是有6个数的整数序列;1、5、10、15、20是有5个数的整数序列。在这个案例程序中,需要创建一个1至100的整数序列。
使用range函数创建整数序列

range函数可以产生一个整数序列,和前面介绍的print函数一样,在使用range函数时需要传入一些值。print函数传入的是要输出的字符串,range函数要传入的是待产生整数序列的起始值、结束值以及步长。
步长是指整数序列中相邻元素的间隔值。例如:如果要产生1、5、10、15、20的整数序列,要传入range函数的起始值是1,结束值是25,步长是5。

range函数的语法如下:

其中,start、end、step为要传入的值,这些值也称为函数参数,range函数需要传入三个参数,分别是start、end、step。statr为整数序列的起始值,end为整数序列的结束值,在生成的整数序列中,不包含结束值。step为整数序列中递增的步长,默认为1,如果采用默认值,step参数可以省略。
用for循环计算自然数1到100的累加和
了解了for循环结构,下面采用for循环结构来实现从自然数1到100的累加和,程序流程图如下:

流程图的sum变量用于存储自然数1到100的累加和,创建的整数序列元素范围为1至100,相邻元素的间隔值为1。
i初始值为range函数产生的整数序列的第一个值。条件判断用于i的值是否在整数序列内:如果i的值在整数序列内,就执行循环体中的语句,即sum+=i;如果i的值不在整数序列内,程序就退出for循环结构,并输出sum变量。
按照流程图编写代码,启动Python IDLE,在IDLE的Shell窗口新建一个代码文件,在新建的代码编辑窗口编写代码。

代码解读
在上面的代码中,首先声明sum变量并初始化为0,然后使用range函数创建1至100范围内的整数序列。
range函数产生1、2、3、……、100的整数序列,range函数的start参数值为1,end参数值为101,因为range函数在产生的整数序列中不包含end,因此end的值要比预定循环结束的值大一个步长,step参数值采用默认的1,因此无需传入step参数。
在for语句中,i为接收整数序列list元素的变量,i的初始值为整数序列中的第一个值,也就是数值1。以后的每次循环i都会被赋值为list的下一个元素,当i为None时,for循环结束。
最后输出sum的值。

上机操作
(1)编写一个程序,使用for循环结构求从自然数1开始,一直乘到20的乘积。即:
1*2*3*……*20
(2)编写一个程序,用for循环输出自然数1到100之间的所有偶数。
提示:能被2整除的数为偶数,在Python语言中可以用取余运算符%来判断某个数值是否是偶数。例如 :a%2的运算结果如果是0,则a为偶数。