Python编程基础题(25-A+B Again)

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))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值