题解 | #学英语#
学英语
https://www.nowcoder.com/practice/1364723563ab43c99f3d38b5abef83bc
import sys dict = {0: '', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 9: 'nine', 10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen', 17: 'seventeen', 18: 'eighteen', 19: 'nineteen', 20: 'twenty', 30: 'thirty', 40: 'forty', 50: 'fifty', 60: 'sixty', 70: 'seventy', 80: 'eighty', 90: 'ninety'} magnitude = {1: 'thousand', 2: 'million', 3: 'billion', 4: 'trillion'} def nums_to_english(num: str): temp_result = [] if len(num) == 3: if int(num[0]) != 0: temp_result += [dict[int(num[0])], 'hundred'] if int(num[1:]) != 0: temp_result.append('and') num = num[1:] if int(num) in dict: temp_result += [dict[int(num)]] else: temp_result += [dict[int(num[0] + '0')], dict[int(num[1])]] return temp_result result = [] for line in sys.stdin: a = line.split()[0] level = 0 while a: if level > 0: result = nums_to_english(a[-3:]) + [magnitude[level]] + result else: result = nums_to_english(a[-3:]) + result a = a[:-3] level += 1 print(' '.join(result))
英文计数每三位进一个数量级,比如4位数是千thousand,7位数是百万million,那么大概思路就是循环从输入中切出后三位做循环直到输入全部切完。
数量级从0开始记,每做一次切片数量级+1,如果数据小于等于3位那就不需要加数量级,大于等于三位的情况根据数量级字典查询即可,如果题目要求的数据数量级超过百万级,给字典里再加更高数量级的键和键值即可,不改主要代码。
每三位的处理:
百位的处理:
如果传入的字符串长度等于3,先对首位做非0判断,如果为0就跳过,不为0的话,根据首位的值在翻译字典中检索其翻译,然后加上hundred关键字,同时判断后两位是否非0,如果后两位都是0就跳过,反之则需要加and关键字(按照英文习惯,加and的条件是百位不为0且百位以下也不为0,就是说不是整百就要加and)。
后两位的处理:
其中1到19的关键字以及100以内的10的整数均录入在字典中,这些情况只需要在字典中查出对应翻译即可,这里做个数字是否在字典中的判断,如果是以上情况则直接从字典中找对应的翻译,如果不是的话,取出十位的数字,拼一个0然后去查找对应的十位翻译,然后再拼上个位翻译即可。
对于0x这种数字,我在字典中给0映射的翻译是空字符,如果是0[1-9]这样的格式,拼出来就是正常的个位数字的翻译,如果是00就拼出来空字符串,因为结果是暂存为列表形式,最后是用空格join的方式输出,所以不影响结果(加入后两位非0判断也行,但是这种情况还是得判断十位是否为0,不如字典中给0映射为空,代码量还少些)。