马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 heidern0612 于 2019-7-28 10:59 编辑
写的内容都是自我思考的过程,难免有疏漏,有错误的地方欢迎广大鱼油给予指正!
学到这一课,眼前一黑,wakao,这么难,有木有?
1、学到了for循环:for i in range(0,10,2)
0到10是循环的范围,不包括10,所以其实是0到9循环的范围。
2表示的是步进,表示隔一个一计算。就像上楼梯,10层的楼梯,如果你两个两个(步进2)的上,五次就上完了。
2、break 和continue
break是跳出整个的大循环,而continue跳出的是当次循环剩余的语句,不影响后面的继续循环。
所以continue我理解为更像是一个过滤器,类比filter,他把不能执行的东西continue了,把能执行的东西留了下来。
例:#coding=gbk
var = "Apython"
for i in var:
if i == "A" :
continue
else:
print(i,end = "")
输出的结果是python,把"A"过滤掉了,好神奇,有木有?
break和continue相同点都在于不执行下面的语句,区别是break就像是癌症,坏了就没办法循环再开始,而continue就像小感冒类似,当前坏了还可以再从头循环。
3、密码验证问题:
1、小甲鱼老师小立了一个flag,用来判断密码输入次数;
2、in 成员操作符,用于关键字判断'*'是否在密码内,是的话,continue过滤掉,跳回循环开始输入密码阶段;
3、密码输入正确,程序break跳出。
此题主要就是考察in成员操作符和continue的作用,很多同学学了却始终没用过continue或in成员操作符(例如我),不是不懂,而是不知道该什么时候用,想办法跟游戏关联一下,你就会发现很多用途咯。
4、摸球的问题:(此球非彼球……)
卧槽,看着好复杂有木有?一点也不明白有木有?谁第一眼看着这种for循环套for循环的语句都懵逼。
其实按照正常人思维推导一下,感觉似乎没有想象的那么难。
只是简单的嵌套三层的for循环,一起分析一下:
首先是red的for循环:
红球数量是0的时候,有几种组合呢?
红球*0 + 黄球*2 + 绿球*6
红球*0 + 黄球*3 + 绿球*5
红球为零的情况下,为了达到摸出的球有8只,只有这两种组合。
红球数量为1的时候呢?
红球*1 + 黄球*1 + 绿球*6
红球*1 + 黄球*2 + 绿球*5
红球*1 + 黄球*3 + 绿球*4
可以从上面看出来,在红球是1的时候,黄球就已经几乎循环了一个遍了,继续:
红球*2 +黄球*0 + 绿球*6
红球*2 + 黄球*1 + 绿球*5
红球*2 + 黄球*2 + 绿球*4
红球*2 + 黄球*3 + 绿球*3
可以看出,红球是2的时候,为了达到8个球的总数,黄球已经可以为零了,话说就是摸出两个红球的时候,黄球就已经从0到3遍历了一遍了。继续:
红球*3 + 黄球*0 + 绿球*5
红球*3 + 黄球*1 + 绿球*4
红球*3 + 黄球*2 + 绿球*3
红球*3 + 黄球*3 +绿球*2
至此,红球和黄球都完成了自身的遍历。红球和黄球的方式推完了,下面我们算绿球的:
绿球为零的时候,红球和黄球都算上(红球、黄球都各只有三个),为了摸出8个球,不够,差俩。
绿球为一的时候,红球和黄球都算上,不够,差一个。
绿球为二的时候呢?,好熟悉,不就是推导黄球遍历的时候 红球*3 + 黄球*3 + 绿球*2 的时候嘛!
绿球为三呢?也找到了,绿球一直到为六(只有六个),也都在上面找到了。
所以,算一算方法,一共是13种,是不是跟答案一样呢?
实际上我不推荐这种笨方法,但是这种笨方法对理解此题有效果。
可以从推算中看出,实际上我们先遍历了红球的从零到3的变化,也就是for i in range(0,4)
其次,红球遍历完了,我们遍历的是黄球(0,4),然后是绿球(2,7)。
所以大循环上,先套上red,red循环0的时候,下面yellow循环2,再下面绿的循环6.
后套上yellow,再套上green.(I don't have any green...)
就把这个题理解了。
5、水仙花数
为啥最后说捏?因为我当时理解这个很费劲。。虽然自己用别的方法做出来了,但是感觉没老师那么精简,另外这个或许也是这节课程里面最难的,分析不易。
先贴上我自己的做法for i in range(1,10):
for j in range(0,10):
for k in range(0,10):
if i*100+j*10+k==i*i*i+j*j*j+k*k*k:
print(i*100+j*10+k)
类似还有以下这种:for i in range(100,999):
a=i//100
b=(i%100)//10
c=i%10
if i==a**3+b**3+c**3:
print(i)
小甲鱼老师的办法现在我用带入法仔细分析下:for i in range(100, 1000):
sum = 0
temp = i
while temp:
sum = sum + (temp%10) ** 3
temp //= 10 # 注意这里要使用地板除哦~
if sum == i:
print(i)
首先第一行,for i in range(100,1000)这个基本都比较好理解吧?
0 赋值给sum,(sum后面其实就是水仙花三者平方相加的和;);temp = i ,也就是for 循环后100到999所有的值
while这里:
第一次循环:
我们首先拿153测试下,当 i循环到153时,temp 也是153.
sum = 0+(153%10)**3; 153%10余数是3,也就是3的3次方,结果是27,也就是此时的sum = 27;
temp // 10 = 153//10 = 15 ; 地板除,不要余,其实就相等150 /10 的结果。
此时temp == 15,不满足temp == 0时while跳出循环,所以循环继续;
第二次循环:
sum = 27(上个sum的值) +(15%10)**3 ; 15%10的余数是5,也就是5的3次方,结果是125;此时sum = 125 +27 =152;
temp //10 , 也就是15//10;地板除,不要余数;相等于10//10 = 1
此时temp == 1,不满足temp ==0时while跳出循环,循环继续。
第三次循环:
sum = 152(上个sum的值) +(1%10)**3 ; 1%10的余数是1,也就是1的3次方,结果是1;此时sum = 152+1 = 153;
temp //10 , 也就是1//10;地板除,不要余数; 数值为0。
此时temp == 0,满足temp ==0时while跳出循环,循环中断。
此时判断if语句,如果sum和值相等,就打印i。此时sum=153, temp在未开始循环时也是153,i的值一开始我们测试的就是153.所以两者相等,打印出来。
这种简单的利用地板除和求余除的办法我脑子愚笨,没想出来,只有大神才用这种简单的办法,我用上面那两种方法就挺好,不过能近距离接触大神的用法,分析下也挺好的。
简单用370再验证一下:
1、370%10 余0 ,sum = 0, temp =370//10 = 37 ;
2、37%10 余7,sum =0+ 7**3 =343, temp = 37//10 = 3
3、3%10 余3, sum = 343+ 3**3 = 370, temp = 3//10 = 0
temp为False(即temp为0)跳出循环。
sum = i =370,所以370也是个水仙花数。
至于为什么 1%10余1,或1//10余0,请自行百度或者拿壳自己做下记住就可以了。
print(1//10)
print(1%10)
|