Python编程:初等数学题解(一)
作者:互联网
基本算术运算
计算机从名字来看就是用来做数学计算的,起初也确实是这样子。所以我们就先从Python做数学计算开始入手,解一下中学的数学题目。
先做点基础知识的准备工作,看看对于数字,Python都有哪些基本运算。
写一段程序如下:
print (123+456)
print (345-123)
print (12*34)
print (12345678987654321*12345678987654321)
print (56/8)
print (56/9)
print (56//9)
print (8%2)
print (8%3)
print (12**3)
运行后的结果如下:
579
222
408
152415789666209420210333789971041
7.0
6.222222222222222
6
0
2
1728
我们仔细看看上面语句,基本上包括了加减乘除取余乘方。需要注意,特别大的数也可以运算,不用特别的处理和写法;还有一个//运算,这是表示整除;取余运算是%;乘方是**表示的。
有了这些基本运算,我们就可以算好多题目了。
求阶乘
阶乘用符号表示为!,是一个连续的乘法,比如3!=3*2*1=6,通用式为n!=n*(n-1)*(n-2)*...*1。
拿到了这个计算求4!这个题目,你毫不费力写下了这么个程序:
print(4*3*2*1)
运行结果为24。正确的。
然后我们再计算8!,你虽然有点觉得不对劲,还是改写了上面的程序:
print(8*7*6*5*4*3*2*1)
运行结果为40320。还是正确。
不过这个时候,你可能没有底气了,你担心下一个题目是20!。
是啊,肯定有什么地方不对劲。我们说了计算机是一种可编程通用计算机器,现在算一个阶乘都需要每次改动程序代码,这也太不通用了吧?
问题就出在这个程序并没有表示出那个通用式:n!=n*(n-1)*(n-2)*...*1。而是用了一个个具体的数字进行计算。好,那我们看看如何解决这个问题。
对于n,我们要拿n个数相乘,每次的乘数减1。道理明白,到具体的程序代码我们要用到循环。看程序:
n=6
result = 1
while n>1 :
result = result * n
n = n - 1
print (result)
解释一下,n变量就是题目里面的数,result变量就是我们要计算出的结果。这个结果是在程序运行过程中逐步算出来的,通过一个while循环实现的,原理正如手工计算一样,对于6*5*4*3*2*1,我们先算6*5,得出30。仔细看一下while语句后面的两句,是缩格的,表示这个while里面的代码块。while n>1意味着只要n还比1大就要永远执行这个代码块。
我们仔细跟踪一遍。
刚开头,变量n为6,结果result为1,这是初始状态。然后程序执行第三行while n>1:,判断的结果6>1,符合条件,于是执行循环代码块,先计算result*n,即1*6,得出6,然后通过=把这个值赋给result保存起来,所以这个时候result为6,n还是6。接着执行循环代码块的第二句话n = n-1(这个表达式冒看挺不好理解的,因为在数学上是错的。但是要记住=在这里不是等于的意思,而是赋值的意思,所以计算机对n=n-1的执行,是先计算出n-1即5,然后把5赋值给n保存起来。)这个时候result为6,n是5。循环代码块执行完了,再去检查while条件,5>1,所以仍然符合条件,还要继续执行代码块。这样一步一步,直到最后n=1的时候,while条件不成立了,就结束这个循环。程序继续执行最后一句print(result),这个时候就是最后的结果720。
这是我们的第一个正儿八经的程序,考虑到有中学生学习,详细讲解了步骤,后面就省略讲解了。头脑中要能一步步跟踪得下来,感受一下一台机器如何一点点算出这个结果来的。编程有时候很痛苦,痛苦的根源在于人太聪明而机器太笨,明明人很容易算出来的东西放在机器里面要用很机械的步骤完成,所以程序员的工作相当于降维,用笨的方法思考问题,时间长了,有时候回忆不起活人是怎么解决问题的了,人脑电脑化了。市面上流行讲一些关于程序员这个职业的笑话,本质上就是由于这个引起的。
你可能会疑惑,计算机内部真的是这么一步步算出来的吗?其实也不是,真实的情况比这个还要笨。这涉及到计算机如何执行指令集了,我们后面专门介绍。计算机专业的最大秘密在于其实计算机很笨,而速度很快(电影《阿甘正传》里面那个橄榄球队的教练说阿甘:笨得跟牛一样,不过跑得可真快),使得外人误以为计算机很聪明。
上面的代码通过循环解决了手工写死一个具体表达式的问题,不过你眼睛里肯定看到了一个堵心的地方,就是第一句话n=6,这么编程序,还是照样只能算一个数,比起刚才效果上只强一点点而已。所以我们要想办法消掉这个写死的6。我们利用Python提供的一个命令input,让用程序的人临时手工给出这个数。程序修改如下:
n=int(input("enter a number:"))
result = 1
while n>1 :
result = result * n
n = n - 1
print (result)
上面的程序input()执行的时候将等待你输入,你输入了6,它就按照6得出最后的结果720,你输入了4,它就得出最后的结果24。
不过,等等,有一个问题,如果这里不输入数字(由于失误或者故意),那怎么办呢?爱动脑筋的你输入了一个x,运行结果如下:
Traceback (most recent call last):
File "E:/Python37/factorial1.py", line 1, in <module>
n=int(input("enter a number:"))
ValueError: invalid literal for int() with base 10: 'x'
出了错!输入的时候,用户可以输入键盘上的任何字符,不是所有的字符都能转换成数字的,x就不行。所以这里我们要做输入错误检查。后面我们讲字符编码的时候再讲怎么判断输入的是不是数字或英文字母。
总之一点,我们上面的程序远不完美,不能校验输入,也不能处理负数。但是不要气馁,编程是一个手工艺,要慢慢提升,坚持编写,坚持思考,就会越练越好。老话说“拳不离手,曲不离口”。
这个题目让我们学到了循环。其实这个概念最早是两百年前的Ada提出来的。她是程序员行业的祖师爷,所以我也把第一个程序特意设计为利用循环算数。
另外,阶乘还有另一个通用式为n!=n*(n-1)!。我们也可以通过程序实现这种方式的计算。这需要引入“递归”的概念。后面再讲。
标签:这个,Python,题解,程序,while,result,print,初等数学,输入 来源: https://blog.51cto.com/u_14602625/2963651