Python来做应用题及思路

最近找工作头疼没事就开始琢磨Python解应用题应该可以,顺便还可以整理下思路当然下面的解法只是个人理解,也欢迎大佬们给意见或者指点更好的解决办法等于优化代码了嘛,也欢迎大家出点小题目做也可以,如果可以我也会定期专门来做应用题(你弟弟或者你表弟或者外甥等来问应用题在也不用算了,把思路和答案给他让他自己一边研究去。)好了先来看如下题目:

1.firstblood题目一:

55名学生围成一个圆圈站好,并按照顺时针的方向依次编号1~55。然后1开始报数,隔一个人3号继续报数,接着是5号,7号……每一轮中,没有报数的同学都走出队伍,知道剩下最后一个人。请问最后一个站在队伍中的人是几号?

首先来聊聊题目中的信息提取也就是程序已知的参数,55个学生可以当一个列表,报数是1,3,5,7隔着报数,偶数位的都被排除,一轮排除后剩下的等于是接到前面列表结束位置的数55继续排除,这里要提醒前面的55这时候就是剩下的第一位,那么数字1就是第二位,等于我们要把每次循环的第一位给排除掉,才能无缝衔接,只要能理解这个很重要的一点这程序就通了。话不多说上代码了:

#!/usr/bin/env python # -*- coding:utf-8 -*- students = [x for x in range(1,56)] #生成学生1到55个学生列表 print students #打印出来后面对比 def leave(team): #定义函数,因为题目剩下的学生还要继续所以用递归的方式 spare = [] #临时创库用于存放每次报数后剩下的学生 if len(team)>1: #判断这个队列的长度不能小于1避免无限递归 for i in range(len(team)+1): #记住这里要的是列表的下标偶数而不是数字偶数(留给你们自己思考) if i==1: #重点中的重点无缝连接55后面下次循环1等于2的位置所以直接排除 continue if i%2==0: #队列中偶数下标的人也就是1,3,5中间的2,4排除掉 continue else: #前面排除后剩下的学生存放到临时仓库 spare.append(team[i-1]) print spare #打印后面衔接的剩下学生 if len(spare)>2: #判断到最后只要两位就是接可以得出结果(由于上面第一位就直接排除的原因) leave(spare) #迭代函数再次排除偶数位置的学生 else: print spare[1] #最后剩下两个人时其实第一个人就直接排除剩下就是最后一个报数的人 else: print "Who lies!!!" #如果没人就打印谁乱报数 leave(students)

程序思路是:首先要循环接力报数,然户要递减人数我这里就用递归的方法,需要递减偶数位置,我这里用列表下标方式对应位置(偶数出列),然后限定条件,就是找到剩余几个人结束,由于每次第一个人直接排除所以到剩下两个人时排除第一个位置后就是答案。下面是结果:

Python来做应用题及思路

2.double kill题目二

有一个监狱犯人吃饭时,如果3个人坐一桌则余2人,5个人坐一桌则余4,7个人坐一桌则余6人,9个人坐一桌则余8人,11个人坐一桌正好坐满,问一共有多少犯人?

还是来先提取题目中的参数信息,如果关键字可以看成程序中的条件if对待,总数X%3=2,X%5=4.......X%9=8..X%11=0,其实这写都是条件,注意的是犯人的总数是要同时满足这几个条件,而不是满足其中一个。是不是思路很清晰了我们可以用程序的and方法就是条件全满足时执行。来看看代码:

#!/usr/bin/env python # -*- coding:utf-8 -*- ''' 1,首先我们不知道这个数,所以可以用X未知数来表示 2,估计一个范围,因为这个数字不是唯一的,答案也不是唯一的除非是选择题目 3,我会用两种写法来解答,各位自己取舍理解好用就行。 ''' for x in range(10000): if x%3==2 and x%5==4 and x%7==6 and x%9==8 and x%11==0: print x, print print [x for x in range(10000) if x%3==2 and x%5==4 and x%7==6 and x%9==8 and x%11==0]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/948bc76ce10fe9d743940d68234dc036.html