Не хотите избыточности и хотите использовать рекурсию - PullRequest
0 голосов
/ 04 февраля 2019

Я использую Python 3.7 и хочу написать программу для написания чисел (очень больших или маленьких).Я написал что-то, но проблема в том, что если я напишу такой код, он будет избыточным и слишком длинным.Есть ли альтернативный способ, с помощью которого я могу напечатать написание независимо от того, насколько велик ввод?Например, если я введу 659556009, я хочу получить выходные данные, например, шестьсот пятьдесят девять миллионов пятьсот пятьдесят шесть тысяч девять.Или, если я дам 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))

Спасибо.

1 Ответ

0 голосов
/ 21 июня 2019

Как это для простого конвертированного вручную рекурсивного числа в текстовый конвертер:

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'
>

Я уверен, что есть некоторые особые случаи, которые все еще нужноиметь дело с, но это упражнение для ОП.

...