首页 > 试题广场 >

Read Number in Chinese (25)

[编程题]Read Number in Chinese (25)
  • 热度指数:7724 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output "Fu" first if it is negative. For example, -123456789 is read as "Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu". Note: zero ("ling") must be handled correctly according to the Chinese tradition. For example, 100800 is "yi Shi Wan ling ba Bai".

输入描述:
Each input file contains one test case, which gives an integer with no more than 9 digits.


输出描述:
For each test case, print in a line the Chinese way of reading the number.  The characters are separated by a space and there must be no extra space at the end of the line.
示例1

输入

-123456789

输出

Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
根据中文的语义,关键位(需要读出来的位)是【个位、十位、百位、千位、万位、亿位】
先根据输入的阿拉伯数字的长度找到最高的“关键位”,然后需要补零的补零,然后递归求解即可
比如“12340567”,找到最高的关键位是“万位”,然后分离出“1234”和“0567”,然后递归求解“1234”得到[yi,Qian,er,Bai,san,Shi,si],关键位是万位["wan"],再补零[ling],再递归求解“567”得到[wu,Bai,liu,Shi,qi],然后将四个list合并起来,得到yi Qian er Bai san Shi si Wan ling wu Bai liu Shi qi

from typing import List

num = int(input())

dic = {
    '1': "yi",
    '2': "er",
    '3': "san",
    '4': "si",
    '5': "wu",
    '6': "liu",
    '7': "qi",
    '8': "ba",
    '9': "jiu",
    '0': "ling"
}


def foo(num_str) -> List[str]:
    if not num_str:
        return []
    if num_str[0] == "-":  # 处理负数
        return ["Fu"] + foo(num_str[1:])
    if len(num_str) == 9:  # 处理九位正数

        r1 = [dic[num_str[0]], "Yi"]
        remainStr = num_str[1:]
        if int(remainStr) == 0:
            return r1
        elif remainStr[0] == '0':
            i = 0
            while remainStr[i] == '0': i += 1
            return r1 + ["ling"] + foo(remainStr[i:])
        else:
            return r1 + foo(remainStr)

    elif 5 <= len(num_str) <= 8:  # 处理五到八位的正数
        i = len(num_str) - 1
        secP = ''
        while len(secP) < 4:
            secP = num_str[i] + secP
            i -= 1
        firP = num_str[:i + 1]

        if int(secP) == 0:
            return foo(firP) + ['Wan']
        elif secP[0] == '0':
            i = 0
            while secP[i] == '0': i += 1
            return foo(firP) + ["Wan", "ling"] + foo(secP[i:])
        else:
            return foo(firP) + ["Wan"] + foo(secP)
    elif 1 <= len(num_str) <= 4:  # 处理1到4位的正数
        d = {
            4: "Qian",
            3: "Bai",
            2: "Shi"
        }
        if len(num_str) == 1:
            return [dic[num_str]]
        else:
            r1 = [dic[num_str[0]], d[len(num_str)]]
            remain = num_str[1:]
            if int(remain) == 0:
                return r1
            elif remain.startswith("0"):
                i = 0
                while remain[i] == "0": i += 1
                return r1 + ["ling"] + foo(remain[i:])
            else:
                return r1 + foo(remain)
    return []


li = foo(str(num))
print(" ".join(li))

发表于 2021-07-12 20:49:32 回复(0)
难道你们都没发现牛客上这个用例是错误的吗?


a = input()
if a == '0':
    print('ling')
else:
    m = ['Yi','Wan','Ge']
    n = [' Qian','',' Shi',' Bai']
    p = ['ling','yi','er','san','si','wu','liu','qi','ba','jiu']
    if a[0] == '-':
        q,a = 'Fu ',a[1:]
    else:
        q = ''
    for i in range(len(a),0,-1):
        m.insert(-((i - 1) // 4 + 1),p[int(a[-i])] + n[i % 4])
    i = 0
    while i < len(m):
        if m[i].split()[0] == 'ling':
            if i == 0 or m[i - 1] == 'ling':
                del m[i]
            else:
                m[i],i = 'ling',i + 1
        elif m[i] in ['Yi','Wan','Ge']:
            if i == 0:
                del m[i]
            elif m[i - 1] == 'ling':
                del m[i - 1]
                if i == 1 or m[i - 2] in ['Yi','Wan','Ge']:
                    del m[i - 1]
                    i -= 1
            else:
                i += 1
        else:
            i += 1
    if 'Ge' in m:
        del m[-1]
    print(q + ' '.join(m))
编辑于 2020-03-08 18:37:36 回复(4)