2018-05-24 Solve Friendly number

初入算法的门,寻求知乎推荐练手

py.checkio 是一个不错的去处,题目都很基础了(相对leetcode和各大教育网OJ来说)

今天做了一个题,觉得很有意思:

Friendly number

Long numbers can be made to look nicer, so let’s write some code to do just that.

You should write a function for converting a number to string using several rules. First of all, you will need to cut the number with a given base (base argument; default 1000). The value is a float number with decimal after the point (decimals argument; default 0). For the value, use the rounding towards zero rule (5.6⇒5, -5.6⇒-5) if the decimal = 0, otherwise use the standard rounding procedure. If the number of decimals is greater than the current number of digits after dot, trail value with zeroes. The number should be a value with letters designating the power. You will be given a list of power designations (powers argument; default ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']). If you are given suffix (suffix argument; default ‘’) , then you must append it. If you don’t have enough powers - stay at the maximum. And zero is always zero without powers, but with suffix.

Let's look at examples. It will be simpler.

  • n=102
    result: "102", the base is default 1000 and 102 is lower this base.
  • n=10240
    result: "10k", the base is default 1000 and rounding down.
  • n=12341234, decimals=1
    result: "12.3M", one digit after the dot.
  • n=12000000, decimals=3
    result: "12.000M", trailing zeros.
  • n=12461, decimals=1
    result: "12.5k", standard rounding.
  • n=1024000000, base=1024, suffix='iB'
    result: '976MiB', the different base and the suffix.
  • n=-150, base=100, powers=['', 'd', 'D']
    result: '-1d', the negative number and rounding towards zero.
  • n=-155, base=100, decimals=1, powers=['', 'd', 'D']
    result: '-1.6d', the negative number and standard rounding.
  • n=255000000000, powers=['', 'k', 'M']
    result: '255000M', there is not enough powers.

Input: A number as an integer. The keyword argument "base" as an integer, default 1000. The keyword argument "decimals" as an integer, default 0. The keyword argument "powers" as a list of string, default ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'].

Output: The converted number as a string.

How it is used: In the physics and IT we have a lot of various numbers. Sometimes we need to make them more simpler and easier to read. When you talk about gigabytes sometimes you don’t need to know the exact number bytes or kilobytes.

Precondition: 1 < base ≤ 1032
-1032 < number ≤ 1032
0 ≤ decimals ≤ 15
0 < len(powers) ≤ 32


小生过于菜鸡,用了将近1个小时才找到思路并写下代码:

from math import log

def friendly_number(number, base=1000, decimals=0, suffix='',
                    powers=['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']):
    """
    Format a number as friendly text, using common suffixes.
    """
    # 负数的处理
    if number < 0:
        signal = '-'
        number = -1*number
    else:
        signal = ''
        
    # 小于base的处理
    if number < base and decimals == 0:
        # print('case1',signal + str(number) + powers[0] + suffix)
        return signal + str(number) + powers[0] + suffix
    elif number < base and decimals != 0:
        # print('case2',signal + str(number) + '.' + '0'*decimals + powers[0] + suffix)
        return signal + str(number) + '.' + '0'*decimals + powers[0] + suffix
    else: 
        root = int(log(number,base))
    
    # 若root值大于powers长度,取最大
    if root >= len(powers):
        number = number / (base**(len(powers)-1)) 
        max_power = powers[-1]
    else:
        number = number / (base**root)
        max_power = powers[root]
    
    # 此时number为形如'1.3234M','24232.223d'的前缀数字,下面保留小数
    zeros = ''
    if decimals == 0:
        # print('case3',signal+str(int(number))+max_power+suffix)
        return signal+str(int(number))+max_power+suffix
    number = round(number,decimals) # 直接保留小数
    decimals = decimals - len(str(number-int(number))[2:])
    # 若小数位数不够,则补0
    while decimals > 0:
        zeros += '0'
        decimals -= 1
    # print('case4',signal+str(number)+'.'+zeros+max_power+suffix)
    return signal+str(number)+zeros+max_power+suffix
但是觉得很有成就感,这也是csdn博客的第一篇文章,诸位见笑了(可能也不会有人看哈哈哈。

猜你喜欢

转载自blog.csdn.net/contr4l_/article/details/80434550
今日推荐