Logo

郎哥编程

计算从1加到100

2020-08-31 1897

使用推土机算法

这是一道很简单的数学题,求自然数1到100的累加和。

01.png

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

02.png

下面是计算从1加到100的推土机算法:

1+2+3+……+99+100 = 5050

03.png

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

使用简便算法

 04.png

 

可以把算式:

1+2+3+……+99+100

利用加法结合律,写成如下的算式:

(1+100)+(2+99)+……+(49+52)+(50+51)

05.png

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

06.png

基于上面的观察结果,可以把上面的算式改写为:

(1+100)* 50 = 5050

这个算式就是从1加到100的简便算法,计算效率比推土机算法效率要快得多。

07.png

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

08.png

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

09.png

10.png

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

11.png

案例02代码中的省略号表示从4累加到98。

可以考虑声明一个sum变量,sum变量的初始值为0,让sum变量从1开始,一直加到100。加法算式可以使用“+=”运算符,“+=”运算符将运算符左边的操作数与右边操作数的值相加后,再赋值给运算符左边的操作数。

12.png

上述语句执行后,sum的值为3,执行过程为:

(1)sum初始值为0;

(2)执行sum+=1语句,sum自身的值加上1再赋值给sum,此时sum的值为1;

(3)执行sum+=2语句,sum自身的值加上2再赋值给sum,此时sum的值为3。

计算从1加到100的推土机算法流程图:

13.png

上面流程图的计算过程并没有完全绘制出来,仅绘制了sum+1和sum+100的过程步骤,用省略号“……”表示了sum从2加到99的过程步骤。这是因为绘制这么多的过程步骤太麻烦了,既费时间又没有多大用处,流程图也不直观。

有了流程图,就要开始写Python代码了。流程图可以用省略号表示sum从2加到99的过程步骤,但在代码中不能忽略,需要写100条类似下面的语句:

14.png

没办法,我还是用了省略号“……”,不然正在阅读的你都不同意。

认识for循环结构

15.png

Python语言提供了一种循环结构,可以快速有效地执行重复性操作,使用循环结构可以解决上面要写100条重复语句的问题。

循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,重复执行语句块(一个语句块包含多条语句,也可以是一条语句),直到条件不成立为止。给定的条件称为循环条件,反复执行的语句块称为循环体。

16.png

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

17.png

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

sum += n

18.png

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

第1次循环时,n的值为1。

第2次循环时,n的值为2。

……

第100次循环时,n的值为100。

19.png

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

for循环结构的语法为:

20.png

其中,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函数创建整数序列

21.png

range函数可以产生一个整数序列,和前面介绍的print函数一样,在使用range函数时需要传入一些值。print函数传入的是要输出的字符串,range函数要传入的是待产生整数序列的起始值、结束值以及步长。

步长是指整数序列中相邻元素的间隔值。例如:如果要产生1、5、10、15、20的整数序列,要传入range函数的起始值是1,结束值是25,步长是5。

22.png

range函数的语法如下:

23.png

其中,start、end、step为要传入的值,这些值也称为函数参数,range函数需要传入三个参数,分别是start、end、step。statr为整数序列的起始值,end为整数序列的结束值,在生成的整数序列中,不包含结束值。step为整数序列中递增的步长,默认为1,如果采用默认值,step参数可以省略。

用for循环计算自然数1到100的累加和

了解了for循环结构,下面采用for循环结构来实现从自然数1到100的累加和,程序流程图如下:

24.png

流程图的sum变量用于存储自然数1到100的累加和,创建的整数序列元素范围为1至100,相邻元素的间隔值为1。

i初始值为range函数产生的整数序列的第一个值。条件判断用于i的值是否在整数序列内:如果i的值在整数序列内,就执行循环体中的语句,即sum+=i;如果i的值不在整数序列内,程序就退出for循环结构,并输出sum变量。

按照流程图编写代码,启动Python IDLE,在IDLE的Shell窗口新建一个代码文件,在新建的代码编辑窗口编写代码。

25.png

代码解读

在上面的代码中,首先声明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的值。

26.png

上机操作

(1)编写一个程序,使用for循环结构求从自然数1开始,一直乘到20的乘积。即:

1*2*3*……*20

(2)编写一个程序,用for循环输出自然数1到100之间的所有偶数。

提示:能被2整除的数为偶数,在Python语言中可以用取余运算符%来判断某个数值是否是偶数。例如 :a%2的运算结果如果是0,则a为偶数。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论