上世纪在民间教育界有句话很出名,叫“学好数理化,走遍天下都不怕”。而我,从小学开始就以一名文科生自居,毕竟数学是真的烂。想着出来工作后,就再也不用面对数学之苦了,结果,没想到啊,没想到,编程就是数学,而且还比加减乘除复杂多了。这日子,简直没发过了!

今天主要学的就是数学,第一节课讲的是(写到这里,我忽然发现自己忘了…赶紧回去看看)浮点数。看着很洋气的名字,简单来说就是带有小数点的数字。比如5.0就是浮点数,5就是整数,这个还是比较好懂的。

唯一的知识点就是python里的浮点数在计算结果非整数的时候,会不准。比如0.1+0.2=0.30000000(一串0)4.没道理啊,中国人都知道0.1+0.2=0.3啊,这是因为计算机是二进制的,十进制的数字在二进制的存储里会有无尽的情况。这个在十进制里也很常见,比如1➗3,就是除不尽的0.333333……。所以在非整数的计算中,如果要求结果特别精确,就不能直接使用0.1+0.2的算法。而是要先定义。

import decimal #调用decimal
a = decimal.Decimal("0.1") #为a赋值精确的0.1
b = decimal.Decimal("0.2") #为b赋值精确的0.2
print(a+b) #打印a+b的结果

只有这样才能得到0.3的结果。

第二节课就比较复杂了,各种运算函数,我看着运算符表头大,估摸着如果用不到,我是不会记住这些东西的。特别是复数什么的,我到现在都不知道这玩意儿是干啥的。看着就头大。

那么这节课里有三个作业,emmm,我都没做出来。

1、使用int函数实现小数点后数字四舍五入效果。

这个我第一反应是用if函数,但是题目要求不能使用其他函数(即使是if函数,我现在也没想好要怎么做)。

实际答案是

A = input("随便一个数字")
A = int(A + 0.5)
print(A)

这个神奇之处就是当小于0.5的浮点数加上0.5也到不了1,会被int函数直接砍掉小数点。而大于等于0.5的的数字加上0.5会直接进1,实现“入”的效果。多出来的小数字仍然会被int函数砍掉。很完美。

这个没做出来是属于脑子不够灵活,教练,我错了。

2、写到这里的时候,我忽然想起,第二道题我好像做出来。题目是做一个记录200次翻硬币结果的程序。

这道理的难点其实就是int,在while函数里,写入扔硬币的次数和循环次数,需要加入int函数。这是因为不加int函数,两个定义之间没法进行对比。这就好像一个人是王大锤,一条狗叫赵小雷,如果不作出一个规矩,他俩是没比的可能的。这个时候int就是定义一个规则,比如王大锤和赵小雷比速度,那么他们就能比了。

还有取正负值的%,这个估计让我想,我一时半会儿也想不到。好在作业里是默认有这个的,否则还得卡很久。

import random #调用随机模块
counts = input("输入扔硬币的次数") #定义counts是一个可输入的变量
i = 0 #定义 i 的值为0
print("开始抛硬币实验:") #打印“开始抛硬币实现:“字样
while i < counts: #循环函数,如果i 小于 counts,也就是i小于用户输入的数字,那么就开始循环。比如我输入200,这里就循环200次。
    num = random.randint(1,2) #定义num为1,2两个数之间的随机值。
    if num % 2:  #假如num可以完整的除以2
        print("正") #那么输出”正“
    else:        #假如不能
        print("负") #则输出”负“
    i = i + 1  # 这个循环的结尾要加1,那么回到循环开始的时候,如果是第一次循环,那么就是0+1,那么小于200啊,就开始循环。如果是第二次那就是1+1,重复至200次为止。

这个还算是比较简单吧,没涉及到太多新东西。

3、第三题题目比较复杂,我就复制一下吧。

相传国际象棋是古印度舍罕王的宰相达依尔发明的。

舍罕王十分喜爱国际象棋,便决定让宰相自己选择何种赏赐。这位聪明的宰相指着 8×8 共 64 格的象棋棋盘说:陛下,请您赏给我一些麦子吧。就在棋盘的第 1 格中放 1 粒,第 2 格放 2 粒,第 3 格放 4 粒,以后每一格都比前一格增加一倍,依此放完棋盘上 64 格,我就感激不尽了……

舍罕王听了达依尔这个“小小”的要求,便让人扛来一袋麦子,他要兑现许诺。结果,在给达依尔发放麦子时,舍罕王发现他要给达依尔的麦子比自己想象的要多得多,一袋麦子是远远不够的……

请编程计算舍罕王应该给达依尔多少粒麦子?

这道题其实我已经做出来了,最后是卡在是2 的 N次方上了,因为2 ** 3跟pow(2,3)是一样的,所以我用了前者。但是这样得出的结果不对。实际答案是pow(2, i-1),这里就差了一个i-1,导致最终结果不对。惜败啊,惜败。

i = 1 #定义I为1,就是象棋中的格子。
sum = 0 #定义sum为0,就是起计数相加作用的。
while i <= 64: #循环函数,当循环次数小于等于64的时候,进行循环。
    wheats = pow(2, i-1) #卡死我的关键点,定义wheats的变量为2的i-1次方。第三个格子是2的三次方,第四个格子是2的四次方,以此类推。
    sum = sum + wheats #将每次的结果记录下来。
    i = i + 1 #增加循环
print("舍罕王应该给达依尔", sum, "粒麦子!") #当循环结束时,将结果打印出来。

因为我的数学底子太差,其实我到现在还没明白pow(2,i-1)为什么跟2**i差距那么大。这真是令人困惑呢……

今天的笔记就到这里,简单来说,数学太复杂了!!!

胭惜雨

2020-12-19 

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据