鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

[已解决]Python:每日一题 332

[复制链接]
 楼主| 发表于 2020-2-15 18:43:15 | 显示全部楼层
阴阳神万物主 发表于 2020-2-15 18:41
这样应该就没有多的空格了。

可以了,38 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-15 18:45:36 | 显示全部楼层
这道题如果有第三方库做这个的就比较好了,不行的话爬虫是最好的解决办法,不仅数字,其他文字都可以翻译
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-15 21:15:25 | 显示全部楼层
本帖最后由 Windypper 于 2020-2-15 21:23 编辑
# !/usr/bin/env python
# -*- coding: utf-8 -*-

def input_num():
    try:
        num = int(input('Please input a positive integer: '))
        if num < 1e15:
            return num
        else:
            print('Integer must be less than 1E+15 and greater than 0')
            input_num()
    except ValueError:
        print('Input Error\n\n')
        input_num()


cardinal = {0: '', 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: 'nineteen', 20: 'twenty', 30: 'thirty', 40: 'forty',
            50: 'fifty', 60: 'sixty', 70: 'seventy', 80: 'eighty', 90: 'ninety',
            }
thousands = {1: '', 2: 'Thousand', 3: 'Million', 4: 'Billion', 5: 'Trillion'}


def num_eng(num, loop=0):
    num_text = ''
    loop += 1
    if num:
        tens = num % 100  # extract tens digit and unit digit
        if tens <= 20:  # the situation tens number less than 20
            tens_text = cardinal[tens]
        else:  # the situation tens number greater than 20
            ten_digit = cardinal[tens - tens % 10]  # extract tens digit
            unit_digit = cardinal[tens % 10]  # extract unit digit
            if ten_digit and unit_digit:  # if both tens digit and unit digit are non-zero, add a hyphen between
                tens_text = f"{ten_digit}-{unit_digit}"
            else:
                tens_text = f"{ten_digit}{unit_digit}"
        if tens and loop > 1:  # if the number is greater than one thousand, add a space after unit digit
            tens_text += ' '

        hundreds = num // 100 % 10  # extract hundred digit
        if not hundreds:  # if hundreds digit is zero, add nothing to the string
            hundreds_text = ''
        else:
            hundreds_text = f'{cardinal[hundreds]} hundred '

        # make string to be titlecased
        tens_text = tens_text.title()
        hundreds_text = hundreds_text.title()

        # add 'and' before tens digit in two situations:
        # 1. both tens digit and hundreds digits are non-zero
        # 2. the last tens digit when the number is greater than one thousand
        if tens and hundreds or num // 1000 and tens and loop == 1:
            hundreds_text += 'and '
        # add 'and' before hundreds digit if it is the last one
        if num // 1000 and hundreds and not tens and loop == 1:
            hundreds_text = 'and ' + hundreds_text

        # recurse to higher magnitude
        num_text = num_eng(num // 1000, loop)
        return num_text + hundreds_text + tens_text + thousands[loop] + ' '

    else:
        if loop == 1:
            num_text = 'Zero'
        return num_text

if __name__ == '__main__':
    num = input_num()
    print(num_eng(num))

不是應該加上and嗎
試了下我這個好像沒問題

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-15 21:22:05 | 显示全部楼层
Windypper 发表于 2020-2-15 21:15
不是應該加上and嗎
試了下我這個好像沒問題

解答错误

输入:1000000
输出:One Million Thousand
预期结果:One Million
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-15 21:28:47 | 显示全部楼层
本帖最后由 Windypper 于 2020-2-15 21:34 编辑
zltzlt 发表于 2020-2-15 21:22
解答错误

输入:1000000

# !/usr/bin/env python
# -*- coding: utf-8 -*-

def input_num():
    try:
        num = int(input('Please input a non-negative integer: '))
        if 0 <= num < 1e15:
            return num
        else:
            print('Integer must be non-negative and less than 1E+15')
            input_num()
    except ValueError:
        print('Input Error\n\n')
        input_num()


cardinal = {0: '', 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: 'nineteen', 20: 'twenty', 30: 'thirty', 40: 'forty',
            50: 'fifty', 60: 'sixty', 70: 'seventy', 80: 'eighty', 90: 'ninety',
            }
thousands = {1: '', 2: 'Thousand', 3: 'Million', 4: 'Billion', 5: 'Trillion'}


def num_eng(num, loop=0):
    num_text = ''
    loop += 1
    if num:
        tens = num % 100  # extract tens digit and unit digit
        if tens <= 20:  # the situation tens number less than 20
            tens_text = cardinal[tens]
        else:  # the situation tens number greater than 20
            ten_digit = cardinal[tens - tens % 10]  # extract tens digit
            unit_digit = cardinal[tens % 10]  # extract unit digit
            if ten_digit and unit_digit:  # if both tens digit and unit digit are non-zero, add a hyphen between
                tens_text = f"{ten_digit}-{unit_digit}"
            else:
                tens_text = f"{ten_digit}{unit_digit}"
        if tens and loop > 1:  # if the number is greater than one thousand, add a space after unit digit
            tens_text += ' '

        hundreds = num // 100 % 10  # extract hundred digit
        if not hundreds:  # if hundreds digit is zero, add nothing to the string
            hundreds_text = ''
        else:
            hundreds_text = f'{cardinal[hundreds]} hundred '

        # make string to be titlecased
        tens_text = tens_text.title()
        hundreds_text = hundreds_text.title()

        # add 'and' before tens digit in two situations:
        # 1. both tens digit and hundreds digits are non-zero
        # 2. the last tens digit when the number is greater than one thousand
        if tens and hundreds or num // 1000 and tens and loop == 1:
            hundreds_text += 'and '
        # add 'and' before hundreds digit if it is the last one
        if num // 1000 and hundreds and not tens and loop == 1:
            hundreds_text = 'and ' + hundreds_text

        # recurse to higher magnitude
        num_text = num_eng(num // 1000, loop)
        if tens or hundreds:
            return num_text + hundreds_text + tens_text + thousands[loop] + ' '
        else:
            return num_text

    else:
        if loop == 1:
            num_text = 'Zero'
        return num_text


if __name__ == '__main__':
    num = input_num()
    print(num_eng(num))

修改了下低級錯誤……

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-15 21:30:13 | 显示全部楼层
Windypper 发表于 2020-2-15 21:28
修改了下低級錯誤……

可以了,35 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-16 00:08:07 | 显示全部楼层
本帖最后由 kinkon 于 2020-2-16 22:59 编辑

加上美元美分单位,如果不符合要求再改掉
def parseFirst(s):
    a = [ "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" ]
    return a[int(s)]
def parseTeen(s):
    a = [ "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen","Seventeen", "Eighteen", "Nineteen" ]
    return a[int(s) - 10]
def parseTen(s): 
    a = [ "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" ]
    return a[int(s[0:1]) - 1]
def transTwo(s):
        value = ""
        if (len(s) > 2):
                s = s[0:2]
        elif (len(s) < 2):
                s = s + "0"
        if (int(s) < 10): 
                value = parseFirst(s)
        elif (int(s) < 20):
                value = parseTeen(s)
        elif (int(s) % 10 == 0) and (int(s) < 100): 
                value = parseTen(s)
        else:
                value = parseTen(s[0:1]) + "-" + parseFirst(s[1:])
        return value
 
def parseMore(s):
        a = [ "", "Thousand", "Million", "Billion" ]
        return a[s]
def transThree(s):
        value = ""
        if (int(s) < 100): 
                value = transTwo(s[1:])
        elif (int(s) % 100 == 0): 
                value = parseFirst(s[0:1]) + " Hundred"
        else:
                value = parseFirst(s[0:1]) + " Hundred And " + transTwo(s[1:])
        return value
        
def f332(x): 
        if(x <= 0):
                return "Zero Cents Only"
        x = str(x)
        z = x.find(".")
        lstr = "" 
        rstr = ""
        if (z > -1): 
                lstr = x[0:z][::-1]
                rstr = x[z+1:]
        else: 
                lstr = x[::-1]
        if (len(lstr) % 3) == 1:
                lstr += "00"
        elif (len(lstr) % 3) == 2:
                lstr += "0"
        lm = ""
        a = [""]*(len(lstr)//3)
        for i in range(len(lstr)//3):
                a[i] = lstr[3 * i: 3 * i + 3][::-1]
                if (a[i] != "000"):
                        if (i != 0) and lm:
                                lm = transThree(a[i]) + " " + parseMore(i) + " " + lm 
                        elif (i != 0):
                            lm = transThree(a[i]) + " " + parseMore(i)
                        else:
                                lm = transThree(a[i])
 
        xs = ""
        if (z > -1):
                trans = transTwo(rstr)
                if(trans == ""):
                        xs = ""
                else:
                        xs = "And " + trans + " Cents "
        return lm + " " + xs + "Only"

print(f332(1000000))
print(f332(214748364890))
print(f332(23.32))

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2020-2-16 06:36:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-16 08:19:09 | 显示全部楼层
萌新刚来,先看看大佬答题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-16 12:21:11 | 显示全部楼层
本帖最后由 白咕咕 于 2020-2-16 12:25 编辑
num = input('请输入数字进行翻译:')

while num:
    if num.isdigit == False:
        print('输入错误!请重新输入:')
    if int(num) >= 2147483648 or int(num) < 0:
        print('输入错误!请重新输入:')
    else:
        break

n_list = list(str(num))

def read_1(n_list):
    dict1 = {
        '1' : 'One',
        '2' : 'Two',
        '3' : 'Three',
        '4' : 'Four',
        '5' : 'Five',
        '6' : 'Six',
        '7' : 'Seven',
        '8' : 'Eight',
        '9' : 'Nine'
        }
    
    n1 = n_list[-1]
    return dict1[n1]

def read_2(n_list):
    dict2 = {
        '11' : 'Eleven',
        '12' : 'Twelve',
        '13' : 'Thirteen',
        '14' : 'Fourteen',
        '15' : 'Fifteen',
        '16' : 'Sixteen',
        '17' : 'Seventeen',
        '18' : 'Eighteen',
        '19' : 'Nineteen',
    }
    dict22 = {
        '0' : '',
        '1' : 'Ten',
        '2' : 'Twenty',
        '3' : 'Thirty',
        '4' : 'Forty',
        '5' : 'Fifty',
        '6' : 'Sixty',
        '7' : 'Seventy',
        '8' : 'Eighty',
        '9' : 'Ninety'
    }
    number = n_list
    n1 = n_list[-1]
    n2 = n_list[-2]
    if n2 == '1':
        result = dict2[number]
    else:
        result = dict22[n2] + ' ' + read_1(n1)
    return result
    
def read_3(n_list):
    n3 = n_list[-3]
    return read_1(n3) + ' Hundred ' + read_2(n_list[-2] + n_list[-1])

def read(n_list):
    l = len(n_list)
    if l >= 3:
        num3 = n_list[l-3:][0] + n_list[l-3:][1] + n_list[l-3:][2]
        if l >= 6:
            num6 = n_list[l-6:l-3][0] + n_list[l-6:l-3][1] + n_list[l-6:l-3][2]
            if l >= 9:
                num9 = n_list[l-9:l-6][0] + n_list[l-9:l-6][1] + n_list[l-9:l-6][2]
    t = 'Thousand'
    m = 'Millon'
    b = 'Billon'
    if l == 1:
        if '0' in n_list:
            return '0'
        else:
            return read_1(n_list)
    elif l == 2:
        return read_2(n_list)
    elif l == 3:
        return read_3(n_list)
    elif l == 4:
        num3 = n_list[l-3:]
        return read_1(n_list[0]) +' '+ t + ' '+ read_3(num3)
    elif l == 5:
        return read_2(n_list[0]+n_list[1]) + ' '+ t + ' '+ read_3(num3)
    elif l == 6:
        return read_3(num6) + ' '+ t + ' '+ read_3(num3)
    elif l == 7:
        return read_1(n_list[0]) + ' '+ m + ' '+ read_3(num6) + ' '+ t + ' '+ read_3(num3)
    elif l == 8:
        return read_2(n_list[0]+ n_list[1]) + ' '+ m + ' '+ read_3(num6) + ' '+ t + ' '+ read_3(num3) 
    elif l == 9:
        return read_3(num9) + ' '+ m + ' '+ read_3(num6) + ' '+ t + ' '+ read_3(num3) 
    elif l == 10:
        return read_1(n_list[0]) + ' '+ b + ' '+ read_3(num9) + ' '+ m + ' '+ read_3(num6) + ' '+ t + ' '+ read_3(num3)

english = read(n_list)
print('翻译结果是:')
print(english)
楼主这样应该可以了


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-16 20:42:55 | 显示全部楼层
_2_ 发表于 2020-2-15 09:56
101 -> One Zero One
是这样吗? @zltzlt

@zltzlt 请删掉 34#
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-16 20:44:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-16 21:02:26 | 显示全部楼层
kinkon 发表于 2020-2-16 00:08
加上美元美分单位,如果不符合要求再改掉

单词拼写错误,Tweleve
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-16 21:04:02 | 显示全部楼层
840613937 发表于 2020-2-16 06:36
虽然是几天前的题了,但是没办法,刚知道这里还有题做的,哈哈哈
花了我一个晚上才做好,我太难了

解答错误

输入:1000000
输出:"One Million Thousand"
预期结果:"One Million"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-16 21:07:04 | 显示全部楼层
白咕咕 发表于 2020-2-16 12:21
楼主这样应该可以了

Million

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2020-2-16 21:46:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-16 21:48:20 | 显示全部楼层

可以了,40 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2020-2-16 21:50:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-16 23:02:24 | 显示全部楼层
zltzlt 发表于 2020-2-16 21:02
单词拼写错误,Tweleve

改好了,我的英文是数学老师教的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-18 11:26:36 | 显示全部楼层
好难,终于做出来了,不确定要不要加and,于是按照网上的说法,在百倍与十位之间加了and
def fun332(num):
    if num >= 0 and num < 2147483648: 
        unit = ['Hundred ', ' Thousand ', ' Million ', ' Billion ']
        numbers = {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: 'Nineteen ', 20: 'Twenty ', 30: 'Thirty ', 
        40: 'Fourty ', 50: 'Fifty ', 60: 'Sixty ', 70: 'Seventy ', 80: 'Eighty ', 90: 'Ninety '}

        list1 = [int(n) for n in str(num)]
        list1.reverse()
        l = len(list1)
        gn = l//3+1 if l%3 else l//3
        glist = []
        for i in range(gn):
            glist.append(list1[i*3:i*3+3])
        temp = []
        for gl in glist:
            temp.append(num2en(gl, numbers, unit))
        result = ''
        for i in range((len(temp)-1), 0, -1):
            if temp[i]:
                result += temp[i] + unit[i]
            else:
                result += temp[i]
        return result + temp[0]
    else:
        print("请输入小于2147483648的正整数!")
        return None
        

def num2en(gl, numbers, unit):
    result = ''
    if len(gl) == 1:
        result += numbers[gl[0]]
    elif len(gl) == 2:
        result = num2en2(gl, numbers)
    else:
        n2 = num2en2(gl[:2], numbers)
        if gl[2]:
            if n2:
                result = numbers[gl[2]]+unit[0]+'And '+n2
            else:
                result = numbers[gl[2]]+unit[0]
        else:
            result = 'And '+ n2 if n2 else ''
            
    return result.strip()


def num2en2(gl2, numbers):
    result = ''
    if gl2[0] == 0:
        result = numbers[gl2[1]*10]
    else:
        if gl2[1] == 1:
            result = numbers[gl2[1]*10 + gl2[0]]
        else:
            result = numbers[gl2[1]*10] + numbers[gl2[0]]
    if 'Zero' in result:
            result = result.replace('Zero', '')
    return result.strip()


print(fun332(1400000))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 21:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表