Description
- A+B是每个JudgeOnline必备的试题,但是今天的A+B有些特别。A和B是以英文形式给出,请你求出A和B的和,并且要以英文形式输出。
Input
输入一个整数T (1 <= T <= 1900) 表示有T个测试数据
每组测试数据两行,每行一个用英文表示的非负整数,表示A和B。
A和B都是非负整数且小于10^9。
Output
对于每组数据,输出一行字符串,表示为A,B和的英文形式。保证A,B之和小于10^9。
Sample Input
3
one
eleven
one
one hundred and two
eleven
one hundred and two
Sample Output
twelve
one hundred and three
one hundred and thirteen
参考程序
Eng=["zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven",\
"twelve","thirteen","fourteen","fifteen", "sixteen","seventeen", "eighteen", "nineteen",\
"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty","ninety"]
Number=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,30,40,50,60,70,80,90]
def ExtractTripleStr(string):
#将原始串按million thousand切分为一个三元组,每个元素都是三位数的英语表示
m_list=""
t_list=""
h_list=""
if "million" in string:
m_tag=string.find("million")
m_list=string[:m_tag].strip(" ")
string=string[m_tag+len("million"):]
if "thousand" in string:
t_tag=string.find("thousand")
t_list=string[:t_tag].strip(" ")
string=string[t_tag+len("thousand"):]
h_list=string.strip(" ")
return (m_list,t_list,h_list)
def TranslateEngToNumber(string):
#输入三位数的英文表示,输出三位数字
if len(string)==0:
return 0
else:
if "hundred" in string:
if "and" in string:
h_tag = string.find("hundred")
h = string[:h_tag].strip(" ")
first = Number[Eng.index(h)]
l = string[h_tag + len("hundred and"):].strip(" ")
if " " in l:
mid, third = l.split(" ")
return first * 100 + Number[Eng.index(mid)] + Number[Eng.index(third)]
else:
return first * 100 + Number[Eng.index(l)]
else:
h_tag=string.find("hundred")
h=string[:h_tag].strip(" ")
return Number[Eng.index(h)]*100
else:
# string=string.strip(" ")
if " " in string:
mid, third = string.split(" ")
return Number[Eng.index(mid)] + Number[Eng.index(third)]
else:
return Number[Eng.index(string)]
def TranslateNumberToEng(num):
#将一个三位数字转换为英语表示
first=num//100
second=num%100
if first==0:
if second==0:
return Eng[0]
else:
#处理一个两位数
if second % 10 == 0 or second <= 20:
return Eng[Number.index(second)]
else:
third = second % 10
second = second - third
return Eng[Number.index(second)] + " " + Eng[Number.index(third)]
else:
if second==0:
return Eng[first] + " hundred"
else:
if second % 10 == 0 or second <= 20:
return Eng[first] + " hundred and " + Eng[Number.index(second)]
else:
third = second % 10
second = second - third
return Eng[first] + " hundred and " + Eng[Number.index(second)] + " " + Eng[Number.index(third)]
def SliceBignumToTriple(number):
#将一个大数每三位一组切分,转换为一个三元组。每个元素都是一个三位数
temp=[]
for i in range(3):
temp.append(number%1000)
number//=1000
temp=temp[::-1]
return tuple(temp)
def ComposeTriToBigStr(tri):
#将三元组(每个元素都是一个三位数字)转换为一个用英文表示的大数
if sum(tri)==0:
return "zero"
else:
res = ""
if tri[0] != 0:
res += TranslateNumberToEng(tri[0]) + " million "
if tri[1] != 0:
res += TranslateNumberToEng(tri[1]) + " thousand "
if tri[2] != 0:
res += TranslateNumberToEng(tri[2])
return res
#主函数部分
T=int(input())
for i in range(T):
A=input()
B=input()
A_tri=ExtractTripleStr(A)
B_tri=ExtractTripleStr(B)
A_num=TranslateEngToNumber(A_tri[0])*10**6+TranslateEngToNumber(A_tri[1])*10**3+TranslateEngToNumber(A_tri[2])
B_num=TranslateEngToNumber(B_tri[0])*10**6+TranslateEngToNumber(B_tri[1])*10**3+TranslateEngToNumber(B_tri[2])
S_tri=SliceBignumToTriple(A_num+B_num)
print(ComposeTriToBigStr(S_tri))