Friendly number
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 using several rules. For starters, you will need to cut the number with a given base (base argument; default 1000). The number should be a coefficient with letters designating the power. The coefficient is a real number with decimal after the point (decimals argument; default 0). 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 (suffixargument; default ‘’) , then you must be add it at the end. For the coefficient, use the rounding down rule (5.6⇒5, -5.6⇒-5) if the decimal = 0, else use the standard rounding procedure. If you don’t have enough powers - stay at the maximum. If the number of decimals are greater than the real number of digits after dot, trail it with zeroes. And zero is always zero without powers.
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 down. - 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.
原题链接: http://www.checkio.org/mission/friendly-number/
题目大义: 将给定的数字, 按照传入的参数, 如小数位, base, 幂次, 及后缀
思路: 熟悉python的数值计算, 在python3之后, /执行的是真正的除法, 通过代码实际运行情况, 发现/的结果均为float型, 无论除数被除数; 另外python3支持大整数, 而在大整数执行/运算时, 结果可能有偏差, 如在本题中
>>> i = 10 ** 32
>>> i /= 1000
>>> i
1e+29
>>> i /= 1000
>>> i
9.999999999999999e+25
以上为在我电脑上python3.4.1的运行结果
可以通过使用Decimal解决这个问题, 代码如下
from decimal import Decimal 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.
"""
step = 0
powers_len = len(powers) - 1 number = Decimal(number) while abs(number) >= base and step < powers_len:
step += 1
number /= base if decimals != 0:
coefficent = round(number, decimals)
else:
coefficent = int(number) return '%.*f' % (decimals, coefficent) + powers[step] + suffix
注意最后一行的写法, 保留小数点位数的形式与c语言类似
review Sim0000's codes
def friendly_number(number, base=1000, decimals=0, suffix='',
powers=['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']):
# At first, decompose the number to value and exponent.
e = 0
while e + 1 < len(powers) and abs(number) >= base ** (e + 1) : e += 1
number /= base ** e
# Then round it.
number = round(number, decimals) if decimals else int(number)
# At last, Format it.
return '{:.0f}'.replace('', str(decimals)).format(number) + powers[e] + suffix
思路一致, 注意第10行的用法, 冒号后是格式控制
Friendly number的更多相关文章
- genToken- Php file
<?php public function genToken($len = 32, $md5 = true) { # Seed random number generator # Only ne ...
- 防止php重复提交表单更安全的方法
Token.php <?php /* * Created on 2013-3-25 * * To change the template for this generated file go t ...
- php表单加入Token防止重复提交的方法分析
http://www.jb51.net/article/94395.htm 这篇文章主要介绍了php表单加入Token防止重复提交的方法,结合实例形式分析了Token防止重复提交的原理与使用技巧,需要 ...
- Java访问权限修饰符public protected friendly private用法总结(转载好文Mark)
首先声明:Java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly.为了条理清晰,分三种不同情况来总结. 一 访问权限修饰符修饰成员变量和 ...
- Fibonacci number
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- 关于Java的权限修饰符(public,private,protected,默认friendly)
以前对访问修饰符总是模棱两可,让自己仔细解释也是经常说不很清楚.这次要彻底的搞清楚. 现在总结如下: 一.概括总结 各个访问修饰符对不同包及其子类,非子类的访问权限 Java访问权限修饰符包含四个:p ...
- Codeforces Gym 100269K Kids in a Friendly Class 构造题
Kids in a Friendly Class 题目连接: http://codeforces.com/gym/100269/attachments Description Kevin resemb ...
- HDU-6534-Chika and Friendly Pairs (莫队算法,树状数组,离散化)
链接: https://vjudge.net/contest/308446#problem/C 题意: Chika gives you an integer sequence a1,a2,-,an a ...
- JavaScript Math和Number对象
目录 1. Math 对象:数学对象,提供对数据的数学计算.如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 2. Number 对象 :Js中提供数字的对象.包含整数.浮 ...
随机推荐
- Oracle 11gR2 RAC Votedisk and OCR Diskgroup Recovery
check votedisk and OCR [root@vzwc1 ~]# ocrcheck Status of Oracle Cluster Registry is as follows : Ve ...
- 【转】Ubuntu重装,直接进win7,不进linux的解决方案(添加Ubuntu启动菜单)
原文网址:http://my.oschina.net/u/1377657/blog/281875 本人重装了Ubuntu12.04.4 LTS, 将Ubuntu启动项放在了/boot分区里面,启动的时 ...
- hdu4623:crime 数学优化dp
鞍山热身赛的题,也是去年多校原题 题目大意: 求n个数的排列中满足相邻两个数互质的排列的数量并取模 当时的思路就是状压dp.. dp[i][state] state用二进制记录某个数是否被取走,i ...
- 【剑指offer】面试题36:数组中的逆序对
题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 归并排序的合并过程.主要是考虑合并两个有序序列时,计算逆序 ...
- HTTP请求的TCP瓶颈分析
这篇文章基本是对<Web性能权威指南>第一章和第二章的读书笔记,另外加一些扩展内容,这本书确实赞,推荐 针对三次握手.流量控制(接收窗口).慢启动(cwnd,拥塞窗口).队首阻塞等方面看下 ...
- Mybatis 开发中遇见的异常及处理
1 异常信息: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.Bin ...
- mysql 存储过程:提供查询语句并返回查询执行影响的行数
mysql 存储过程:提供查询语句并返回查询执行影响的行数DELIMITER $$ DROP PROCEDURE IF EXISTS `p_get_select_row_number`$$ CREAT ...
- Learning Lua Programming (3) iMac下搭建Lua脚本最好的编码环境(代码补全,编译运行)
这篇文章参考自http://blog.sina.com.cn/s/blog_991afe570101rdgf.html,十分感谢原作者的伟大创造,本人亲测可行. 这篇文章记录一下如何在MAC系统环境下 ...
- AAM(Active Appearance Model)算法介绍
前面介绍ASM算法(http://blog.csdn.net/carson2005/article/details/8194317)的时候,笔者提到,ASM是基于统计形状模型的基础上进行的,而AAM则 ...
- C++11 lambda 表达式
C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lamb ...