首页 > 解决方案 > 不想要冗余并且想要使用递归

问题描述

我正在使用 Python 3.7 并想编写拼写数字(非常大或小)的程序。我写了一些东西,但问题是如果我写这样的代码,那将是多余的而且太长了。无论输入有多大,有没有其他方法可以打印拼写?例如,如果我给出输入 659556009,我希望得到类似 65590555609 的输出。或者,如果我给 2001,它会给我 2001。谁能帮我?

num = int(input("number :"))

def word(num):
    d1= {0:'Zero',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:'Ninteen',20:'Twenty',30:'Thirty',40:'Fourty',50:'Fifty',60:'Sixty',70:'Seventy',80:'Eighty',90:'Ninty'}
    k = 1000
    m = k * 1000
    if (num<20):
       return d1[num]
    if (num<100):
       if num % 10 == 0:
          return d1[num]
       else:
           return d1[num // 10 * 10] + ' ' + d1[num % 10]

    if (num < k):
        if num % 100 == 0:
           return d1[num // 100] + ' hundred'
        else:
            return d1[num // 100] + ' hundred ' + word(num % 100)
    if (num < m):
       if num % k == 0:
          return word(num // k) + ' thousand'
       else:
           return word(num // k) + ' thousand, ' + word(num % k)

print (word(num))

谢谢你。

标签: pythonrecursionredundancy

解决方案


这对于一个简单的手动递归数字到文本转换器来说是怎样的:

from math import log

DIGITS = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
TEENS = ['ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
TENS = ['error', 'error', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']
POWERS = ['error', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintrillion', 'sextillion', 'septillion', 'octillion', 'nonillion']

def three_digits_to_list(number):
    places = []

    while number:
        places.insert(0, number % 10)
        number //= 10

    result = []

    if len(places) == 3:
        result.extend([DIGITS[places.pop(0)], "hundred"])

    if len(places) == 2:
        if places[0] > 1:
            result.append(TENS[places.pop(0)])
        elif places[0] == 1:
            places.pop(0)
            result.append(TEENS[places.pop(0)])

    if len(places) == 1:
        result.append(DIGITS[places.pop(0)])

    return result

def number_to_list(number, flag=False):
    try:
        power = int(log(number, 1000))
    except ValueError:
        return [0] if flag else []  # special case for 0

    if power == 0:
        return three_digits_to_list(number)

    magnitude = 1000 ** power
    hundreds = number // magnitude

    return three_digits_to_list(hundreds) + [POWERS[power]] + number_to_list(number - hundreds * magnitude)

def number_to_text(number):
    return " ".join(number_to_list(number, True))

print(repr(number_to_text(659556009)))

输出:

> python3 test.py
'six hundred fifty nine million five hundred fifty six thousand nine'
>

我确信仍有一些特殊情况需要处理,但这是 OP 的练习。


推荐阅读