第4关:控制结构综合实训
- 第一题
- 第二题(※)
- 第三题(※)
- 第四题(※)
- 第五题(※)
- 第六题(※)
第一题
#第一题def rankHurricane(velocity):#请在下面编写代码# ********** Begin ********** #if velocity<74:rank=Noneelif 74 <= velocity <= 95:rank = 1elif velocity <= 110:rank = 2elif velocity <= 130:rank = 3elif velocity <= 154:rank = 4else:rank = 5# ********** End ********** ##请不要修改下面的代码return rank
第二题(※)
解题思路:
(1)在八位数字里,从右边开始,取最后一位后,加至偶数位和中,然后去掉最后一位,此时为奇数位,取其并乘2
(2)把奇数位乘以2的结果拆解相加:结果是两位数,因此先%10得到个位数,后//10去掉个位数,循环结束条件为even==0,即十位数已经加完,只剩下十位数//10,得到0,不再进行相加
(3)去掉该奇数位,如此循环。循环结束条件依然是num为0
#第二题def validCreditCard(num):#请在下面编写代码# ********** Begin ********** #valid=Falseif 10000000<num<100000000:oddSum=0even=0evenSum=0while not(num==0):oddSum+=(num%10)num=num//10even=(num%10)*2while not(even==0):evenSum+=(even%10)even=even//10num=num//10final=oddSum+evenSumif final%10==0:valid=True# ********** End ********** # #请不要修改下面的代码return valid
第三题(※)
解题思路:
(1)在九位数字中,先把公式中的权重和写出来:从最后一位起,逐个乘以对应系数
(2)使用字符串相连接,不足九位,前面补0
(3)将公式总和%11,余数为1,则补X;余数为0,则刚好是11的倍数,补0;其他情况,算加上数字几后可以成为11的倍数,后补上该数字
#第三题def ISBN(n):# 请在下面编写代码# ********** Begin ********** #total=0num=nfor i in range(2,11):digit=num%10total+=i*digitnum//=10strn=str(n)if len(strn)<9:strn='0'*(9-len(strn))+strntrueISBN=''if total%11==1:trueISBN=strn+'X'elif total%11==0:trueISBN=strn+'0'else:trueISBN=strn+str(11-(total%11)) # ********** End ********** # # 请不要修改下面的代码return (trueISBN)
第四题(※)
解题思路:
(1)本题涉及三个函数的编写
(2)借助计算y年m月d日是星期几这个函数(记):
(3)判断闰年的函数:四年一闰,百年不闰,四百年又闰
(4)将本月1号是星期几赋给date,并判断此月有多少天
(5)打印y年m月,打印星期,打印一号前的空格,而后打印1号到28/29/30/31号,一星期一星期打印。count = (count + 1) % 7
更新count为下一天的星期几,如果count为0,表示已经到了星期六,打印换行符print()
以开始新的一周
#第四题def day(y, m, d):#计算y年m月d日是星期几# 请在下面编写代码# ********** Begin ********** ## 调整年份,如果月份在3月之前,年份减1y0 = y - (14 - m) // 12# 计算世纪数和世纪内的年份,用于计算星期几x = y0 + y0 // 4 - y0 // 100 + y0 // 400# 调整月份,如果月份在3月之前,将其转换为前一年的13月或14月m0 = m + 12 * ((14 - m) // 12) - 2# 使用蔡勒公式计算星期几,结果是一个0到6的数字,0代表星期六,1代表星期日,以此类推d0 = (d + x + (31 * m0) // 12) % 7# ********** End ********** # # 请不要修改下面的代码return d0def isLeapYear(year): #判断year年是否闰年# 请在下面编写代码# ********** Begin ********** #isLeapYear=(year%4==0)isLeapYear=isLeapYear and (year%100!=0)isLeapYear=isLeapYear or (year%400==0)# ********** End ********** # # 请不要修改下面的代码return isLeapYeardef calendar(y, m): #打印y年m月日历print(' {}年{}月'.format(y,m))print('Su\tM\tTu\tW\tTh\tF\tSa')# 请在下面编写代码# ********** Begin ********** #date=day(y,m,1)days=0if m in [1,3,5,7,8,10,12]:days=31elif m in [4,6,9,11]:days=30else:if isLeapYear(y):days=29else:days=28count=datefor i in range(date):print('\t',end='')for d in range(1,days+1):print(str(d)+'\t',end="")count=(count+1)%7if count==0:print()print()# ********** End ********** ## 请不要修改下面的代码
测试结果:
第五题(※)
解题思路:
(1)利用四个嵌套循环找到abcd
(2)从1到n开始找a,然后从a到n开始找b,然后等号右边,从a+1到n开始找c,从c到n开始找d
(3)这个过程中,a的立方、a的立方+b的立方不能超过n,c的立方不能超过a的立方+b的立方、c的立方+d的立方不能超过a的立方+b的立方
#第五题def ramanujan(n):results = []#请在下面编写代码# ********** Begin ********** #for a in range(1,n+1):a3=a*a*aif a3>n:breakfor b in range(a,n+1):b3=b*b*bif a3+b3>n:breakfor c in range(a+1,n+1):c3=c*c*cif c3>a3+b3:breakfor d in range(c,n+1):d3=d*d*dif c3+d3>a3+b3:breakif c3+d3==a3+b3:result=str(a3+b3)+' = '+str(a)+'^3 + '+str(b)+'^3 = '+str(c)+'^3 + '+str(d)+'^3'results.append(result)# ********** End ********** # # 请不要修改下面的代码return results
测试结果:
第六题(※)
解题思路:
(1)0~9:借助字典转换
(2)10 ~ 19、 20 ~ 99:用字典写出10 ~ 19的转换以及0、2 ~ 9的转换
(3)百位:分为0 ~ 99和100以后的处理
#第六题def unit_to_word(u): #将0~9的数字转换成英文,并返回转换后的英文# 请在下面编写代码# ********** Begin ********** ## 定义一个转换表,将数字映射到对应的英文单词convert_table = {0: "zero",1: "one",2: "two",3: "three",4: "four",5: "five",6: "six",7: "seven",8: "eight",9: "nine",}# 返回对应的英文单词return convert_table[u]# ********** End ********** ## 请不要修改下面的代码def tens_to_word(t): #利用unit_to_word,将10~19、以及20~99的十位部分数字转换成英文,并返回转换后的英文# 请在下面编写代码# ********** Begin ********** #convert_table={0:"",10:"ten",11:"eleven",12:"twelve",13:"thirteen",14:"fourteen",15:"fifteen",16:"sixteen",17:"seventeen",18:"eighteen",19:"nineteen",2:"twenty",3:"thirty",4:"forty",5:"fifty",6:"sixty",7:"seventy",8:"eighty",9:"ninety",}# 如果数字在10到19之间,直接返回对应的英文单词if 9<t<20:return convert_table[t]else:tens=convert_table[t//10]+" "+unit_to_word(t%10)return tens.lstrip()# ********** End ********** ## 请不要修改下面的代码def hundreds_to_word(h): #利用unit_to_word、tens_to_word进行转换,并返回转换后结果的函数# 请在下面编写代码# ********** Begin ********** ## 如果数字大于99,处理百位if h>99:word=unit_to_word(h//100)+" hundred"tens=h%100if tens==0:return wordelse:return word+" and "+tens_to_word(tens)# 如果数字小于或等于99,直接调用tens_to_word函数else:return tens_to_word(h)# ********** End ********** # # 请不要修改下面的代码
测试结果: