python中整数到单词的错误答案

2024-09-30 20:32:19 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我是python和编程的初学者。我想解决一个leetcode问题,把正整数转换成word。我的算法似乎几乎是正确的,但有一些瓶颈。 我不知道如何去掉小于100的one,请看输出,这使得转换错误。 我干了一段时间,运气不好,觉得应该寻求帮助。谢谢

def numberToWords(num):
    store = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five', 6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 11: 'Eleven', 12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen', 15 : 'fifteen', 16: 'Sixteen', 17: 'Seventeen', 18: 'Eighteen',
            19: 'Nineteen'}

    word = ['Billion', 'Million', 'Thousand', 'Hundred', 'Ninety', 'Eighty', 'Seventy', 'Sixty', 'Fifty',\
            'Forty', 'Thirty', 'Twenty', 'Ten', 'Nine', 'Eight', 'Seven', 'Six', 'Five', 'Four', 'Three', 'Two', 'One']
    value = [1000000000, 1000000, 1000, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    if num == 0: return 'Zero'
    result = ''
    if num in store: return store[num]
    for i in range(len(value)):
        if (num //value[i] >= 1):
            y = num // value[i]
            result += numberToWords(y) + " " + word[i] + " "
        num %= value[i]

    return result

print(numberToWords(12345))

我的输出:"Twelve Thousand Three Hundred One Forty One Five " 预期输出:"Twelve Thousand Three Hundred Forty Five"


Tags: storereturnifvalueresultonenumword
2条回答

如果值[i]小于100,就不要打印一个。在这里:

def numberToWords(num):
    store = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five', 6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 11: 'Eleven', 12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen', 15 : 'fifteen', 16: 'Sixteen', 17: 'Seventeen', 18: 'Eighteen',
            19: 'Nineteen'}

    word = ['Billion', 'Million', 'Thousand', 'Hundred', 'Ninety', 'Eighty', 'Seventy', 'Sixty', 'Fifty',\
            'Forty', 'Thirty', 'Twenty', 'Ten', 'Nine', 'Eight', 'Seven', 'Six', 'Five', 'Four', 'Three', 'Two', 'One']
    value = [1000000000, 1000000, 1000, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    if num == 0: return 'Zero'
    result = ''
    if num in store: return store[num]
    for i in range(len(value)):
        if (num //value[i] >= 1):
            y = num // value[i]
            if value[i] < 100:
               result += word[i] + " "
            else:
               result+=numberToWords(y) + " " + word[i] + " "
        num %= value[i]

    return result

print(numberToWords(12345))

产量:一万二千三百四十五

你的核心逻辑很好。基本上,您的方法将数字分解为10的幂。(数量*价值)

例如:2004=2*1000+0*100+0*10+4*1

然后转换为数量和值连接的字符串:

例如。 2*1000+1*4=(‘二’+‘千’)+(‘一’+‘四’)。你知道吗

本质上2*1000是,2Thousands。问题是,在最后一位小数点处,代码将1*4转换为1*4,因为从技术上讲,1*4实际上是4个1。你知道吗

所以检查是否在最后一个小数位,并省略值的字符串,这是我在下面的代码中所做的。你知道吗

有其他的边缘情况固定。例如20014是两万和十四,而不是两万,一个十和四。这是通过检查num是否在每个循环迭代的store中而不是只在开始时。你知道吗

def numberToWords(num):
    store = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five', 6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 11: 'Eleven', 12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen', 15 : 'fifteen', 16: 'Sixteen', 17: 'Seventeen', 18: 'Eighteen',
            19: 'Nineteen'}

    word = ['Billion', 'Million', 'Thousand', 'Hundred', 'Ninety', 'Eighty', 'Seventy', 'Sixty', 'Fifty',\
            'Forty', 'Thirty', 'Twenty', 'Ten', 'Nine', 'Eight', 'Seven', 'Six', 'Five', 'Four', 'Three', 'Two', 'One']
    value = [1000000000, 1000000, 1000, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
    if num == 0: return 'Zero'
    result = ''
    if num in store:
      return store[num]
    for i in range(len(value)):
        if (num //value[i] >= 1):
            y = num // value[i]
            if num in store: # <  Check if num now has a standard word
                result += store[num]
                break
            elif num > 9 and y > 1: # <  check for last decimal place
              result += numberToWords(y) + " " + word[i] + " "
            elif num > 9 and y == 1:
              result += word[i] + " "
            else:
              result += 'and ' + numberToWords(num)
        num %= value[i]

    return result

print(numberToWords(20014)) # Twenty  Thousand Fourteen
print(numberToWords(121)) # Hundred Twenty One

相关问题 更多 >