python3 第十九章 - 写一个10进制转任意进制的函数
我们先回忆下之前所学的进制转换的知识(详见:第十章),10进制转其它进制的方法是:
- 整数部分,除基取余,逆序排列
- 小数部分,乘基取整,顺序排列
- 负数,按绝对值处理
好,假设我们需要转化的数都是正整数,那这个函数可以这样写:
def Convert1(num:'十进制的数', base:'转换为这个进制的数')->'转化之后的数':
# 0〜36的数的表示
index = ["", "", "", "", "", "", "", "", "", "", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
res = "" # 用来存储结果
while num >= base:
num1 = num // base # 商
num2 = num % base # 余数
num = num1
res = str(index[num2]) + res
else:
res = str(num) + res
return res
添加调用函数的代码:
def Convert1(num:'十进制的数', base:'转换为这个进制的数')->'转化之后的数':
# 0〜36的数的表示
index = ["", "", "", "", "", "", "", "", "", "", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
res = "" # 用来存储结果
while num >= base:
num1 = num // base # 商
num2 = num % base # 余数
num = num1
res = str(index[num2]) + res
else:
res = str(num) + res
return res
num = input('请输入一个十进制数,并按回车:') # 十进制数
num = int(num)
base = input('请输入一个2 ~ 36的数字表示进制,并按回车:') # 转化为这个进制
base = int(base)
print(Convert1(num, base))
运行代码,分别输入回车、回车,程序输出:
请输入一个十进制数,并按回车:100
请输入一个2 ~ 36的数字表示进制,并按回车:26
3M
通过在线验证工具:http://tool.oschina.net/hexconvert/ 验证正确。
现在,假设我们需要转化的数都是 0〜1 之间的小数:
def Convert2(num:'0到1之间的十进制的数', base:'转换为这个进制的数')->'转化之后的数':
# 0〜36的数的表示
index = ["", "", "", "", "", "", "", "", "", "", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
res = "0." # 用来存储结果
while (num < 1) & (num >0):
num1 = num * base # 积
num2 = int(num1 // 1) # 取整
num = num1 - num2
res += str(index[num2])
if len(res) >10: # 只保留8位
break
return res
num = input('请输入一个十进制数,并按回车:') # 十进制数
num = float(num)
base = input('请输入一个2 ~ 36的数字表示进制,并按回车:') # 转化为这个进制
base = int(base)
print(Convert2(num, base))
思考:假如在while中不做位数判断会出现什么情况?
接下来我们只要把整数部分和小数部分的组合起来,就可以得到最终的函数:
def Convert1(num:'十进制的数', base:'转换为这个进制的数')->'转化之后的数':
# 0〜36的数的表示
index = ["", "", "", "", "", "", "", "", "", "", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
res = "" # 用来存储结果
while num >= base:
num1 = num // base # 商
num2 = num % base # 余数
num = num1
res = str(index[num2]) + res
else:
res = str(num) + res
return res
def Convert2(num:'0到1之间的十进制的数', base:'转换为这个进制的数')->'转化之后的数':
# 0〜36的数的表示
index = ["", "", "", "", "", "", "", "", "", "", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
res = "." # 用来存储结果 , 没合并时这里是 0. 想一想现在为什么要改成 .
while (num < 1) & (num >0):
num1 = num * base # 积
num2 = int(num1 // 1) # 取整
num = num1 - num2
res += str(index[num2])
if len(res) >10: # 只保留8位
break
return res
def Convert(num, base):
"""
:param num:十进制数
:param base: 要转换为这个进制
:return: 返回转换后的数
"""
numConvert = abs(num) # 得到num的绝对值
num1 = int(numConvert // 1) # 得到整数部分
num2 = numConvert - num1 # 得到小数部分
if num2 == 0:
res = Convert1(num1, base)
else:
res = Convert1(num1, base) + Convert2(num2, base)
return res
# 调用函数
num = input('请输入一个十进制数,并按回车:') # 十进制数
num = float(num)
base = input('请输入一个2 ~ 36的数字表示进制,并按回车:') # 转化为这个进制
base = int(base)
print(Convert(num, base))
至此,函数就写好了,但是我们发现,这个函数并不完美,因为,我们必须保证输入的10进制数字是正确的,否则函数会报错,请思考:如何用前些章学过的知识改进函数,使用当用户输入不正确的格式时提示用户重新输入? 后面的章节里,我们再来讲如何处理这种情况。
python3 第十九章 - 写一个10进制转任意进制的函数的更多相关文章
- python3 第二十九章 - 内置函数之tuple相关
Python元组包含了以下内置函数 序号 方法及描述 实例 1 len(tuple)计算元组元素个数. >>> tuple1 = ('Google', 'Baidu', 'Taoba ...
- 【C++】《C++ Primer 》第十九章
第十九章 特殊工具与技术 一.控制内存分配 1. 重载new和delete new表达式的工作机理: string *sp = new string("a value"); //分 ...
- 第十九章——使用资源调控器管理资源(1)——使用SQLServer Management Studio 配置资源调控器
原文:第十九章--使用资源调控器管理资源(1)--使用SQLServer Management Studio 配置资源调控器 本系列包含: 1. 使用SQLServer Management Stud ...
- 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器
原文:第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来配置资源调控器.但是作为DBA,总有需要写脚本的时候,因为它可以重用及扩展. ...
- Gradle 1.12用户指南翻译——第四十九章. Build Dashboard 插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- Gradle 1.12用户指南翻译——第二十九章. Checkstyle 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- Gradle 1.12用户指南翻译——第三十九章. IDEA 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 第十九章 Django的ORM映射机制
第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...
- Gradle 1.12翻译——第十九章. Gradle 守护进程
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
随机推荐
- 基于vue2+vuex+vue-router+sass+webpack的网易云音乐
[本博客为原创:http://www.cnblogs.com/HeavenBin/] 前言: 这段时间写的一个项目,供给大家互相学习,有什么疑问可以issues我. 源码地址:https://git ...
- PyQt4 模拟记事本基本功能(保存,打开文件)
完成功能: 1. 默认[保存]按钮enable 2. 修改文本的内容后,[enable] 3. 解决字符乱码问题:utf-8 4. 提示:如果修改了文件没有保存的时候,又尝试打开新的文件,给出相关的提 ...
- MySQL并发复制系列二:多线程复制 2016
并发复制(Parallel Replication) 系列二: Enhanced Multi-threaded Slaves作者:沃趣科技MySQL数据库工程师 麻鹏飞 首先梳理下传统MySQL/M ...
- web页面接入QQ客服的方法
在做微信二次开发的时候或者手机版网页的时候有人想在接qq客服,下面我就分享一下具体操作: 1,准备一个QQ号,可以是企业QQ,也可以是个人QQ.登录网址:http://shang.qq.com/wid ...
- shader程序员需要注意的优化Tips
在写shader的时候,其实一些写法对于其执行影响非常大,而且由于gpu和cpu在架构上的不同,代码的优化思想也不一样,最近一直在写几个shader,为了性能问题,查阅了很多资料,把一些tips总结下 ...
- Modelsim独立仿真Vivado Clocking Wizard IP Core
工欲善其事,必先利其器.在使用Vivado自带的仿真软件仿真的时候,相对于更优秀的仿真工具Modelsim,效率低了很多,为了更高效的开发,我尝试着用Vivado级联Modelsim仿真,但是级联后还 ...
- java_web学习(九) PreparedStatement动态参数的引入
一.PreparedStatement 概述 在数据库的操作过程中,PreparedStatement 对象是一个很不起眼但是记为重要的接口对象,它继承 于Statement,并与之在两方面有所不同: ...
- div 初始高度,并随内容高度变化
前几天做个邮箱系统,其中在内容的div设置了高度为200px; 可是在内容大于200高度后就出现了内容的溢出. 如图: 查完资料够才知道css有个min-height; 设置div的初始化高度,设置属 ...
- AtCoder Regular Contest 076
在湖蓝跟衡水大佬们打的第二场atcoder,不知不觉一星期都过去了. 任意门 C - Reconciled? 题意:n只猫,m只狗排队,猫与猫之间,狗与狗之间是不同的,同种动物不能相邻排,问有多少种方 ...
- bat复制文件夹下所有文件到另一个目录
一个需求,网上了半天都是错了,所以记一下吧,方便你我. copy是文件拷贝,文件夹拷贝需要用到xcopy @echo off::当前盘符set curPath=%cd%set digPath =&qu ...