第4关:控制结构综合实训
- 第一题
- 第二题(※)
- 第三题(※)
- 第四题(※)
- 第五题(※)
- 第六题(※)
第一题
#第一题
def rankHurricane(velocity):
#请在下面编写代码
# ********** Begin ********** #
if velocity<74:
rank=None
elif 74 <= velocity <= 95:
rank = 1
elif velocity <= 110:
rank = 2
elif velocity <= 130:
rank = 3
elif velocity <= 154:
rank = 4
else:
rank = 5
# ********** End ********** #
#请不要修改下面的代码
return rank
第二题(※)
解题思路:
(1)在八位数字里,从右边开始,取最后一位后,加至偶数位和中,然后去掉最后一位,此时为奇数位,取其并乘2
(2)把奇数位乘以2的结果拆解相加:结果是两位数,因此先%10得到个位数,后//10去掉个位数,循环结束条件为even==0,即十位数已经加完,只剩下十位数//10,得到0,不再进行相加
(3)去掉该奇数位,如此循环。循环结束条件依然是num为0
#第二题
def validCreditCard(num):
#请在下面编写代码
# ********** Begin ********** #
valid=False
if 10000000<num<100000000:
oddSum=0
even=0
evenSum=0
while not(num==0):
oddSum+=(num%10)
num=num//10
even=(num%10)*2
while not(even==0):
evenSum+=(even%10)
even=even//10
num=num//10
final=oddSum+evenSum
if final%10==0:
valid=True
# ********** End ********** #
#请不要修改下面的代码
return valid
第三题(※)
解题思路:
(1)在九位数字中,先把公式中的权重和写出来:从最后一位起,逐个乘以对应系数
(2)使用字符串相连接,不足九位,前面补0
(3)将公式总和%11,余数为1,则补X;余数为0,则刚好是11的倍数,补0;其他情况,算加上数字几后可以成为11的倍数,后补上该数字
#第三题
def ISBN(n):
# 请在下面编写代码
# ********** Begin ********** #
total=0
num=n
for i in range(2,11):
digit=num%10
total+=i*digit
num//=10
strn=str(n)
if len(strn)<9:
strn='0'*(9-len(strn))+strn
trueISBN=''
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月之前,年份减1
y0 = 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 d0
def isLeapYear(year): #判断year年是否闰年
# 请在下面编写代码
# ********** Begin ********** #
isLeapYear=(year%4==0)
isLeapYear=isLeapYear and (year%100!=0)
isLeapYear=isLeapYear or (year%400==0)
# ********** End ********** #
# 请不要修改下面的代码
return isLeapYear
def calendar(y, m): #打印y年m月日历
print(' {}年{}月'.format(y,m))
print('Su\tM\tTu\tW\tTh\tF\tSa')
# 请在下面编写代码
# ********** Begin ********** #
date=day(y,m,1)
days=0
if m in [1,3,5,7,8,10,12]:
days=31
elif m in [4,6,9,11]:
days=30
else:
if isLeapYear(y):
days=29
else:
days=28
count=date
for i in range(date):
print('\t',end='')
for d in range(1,days+1):
print(str(d)+'\t',end="")
count=(count+1)%7
if 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*a
if a3>n:
break
for b in range(a,n+1):
b3=b*b*b
if a3+b3>n:
break
for c in range(a+1,n+1):
c3=c*c*c
if c3>a3+b3:
break
for d in range(c,n+1):
d3=d*d*d
if c3+d3>a3+b3:
break
if 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%100
if tens==0:
return word
else:
return word+" and "+tens_to_word(tens)
# 如果数字小于或等于99,直接调用tens_to_word函数
else:
return tens_to_word(h)
# ********** End ********** #
# 请不要修改下面的代码
测试结果: