我们先回忆下之前所学的进制转换的知识(详见:第十章),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进制转任意进制的函数的更多相关文章

  1. python3 第二十九章 - 内置函数之tuple相关

    Python元组包含了以下内置函数 序号 方法及描述 实例 1 len(tuple)计算元组元素个数. >>> tuple1 = ('Google', 'Baidu', 'Taoba ...

  2. 【C++】《C++ Primer 》第十九章

    第十九章 特殊工具与技术 一.控制内存分配 1. 重载new和delete new表达式的工作机理: string *sp = new string("a value"); //分 ...

  3. 第十九章——使用资源调控器管理资源(1)——使用SQLServer Management Studio 配置资源调控器

    原文:第十九章--使用资源调控器管理资源(1)--使用SQLServer Management Studio 配置资源调控器 本系列包含: 1. 使用SQLServer Management Stud ...

  4. 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器

    原文:第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来配置资源调控器.但是作为DBA,总有需要写脚本的时候,因为它可以重用及扩展. ...

  5. Gradle 1.12用户指南翻译——第四十九章. Build Dashboard 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  6. Gradle 1.12用户指南翻译——第二十九章. Checkstyle 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  7. Gradle 1.12用户指南翻译——第三十九章. IDEA 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  8. 第十九章 Django的ORM映射机制

    第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...

  9. Gradle 1.12翻译——第十九章. Gradle 守护进程

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

随机推荐

  1. form注册表单圆角 demo

    form注册表单圆角 <BODY> <div class="form"> <ul class="list"> <li& ...

  2. docker:(5)利用docker -v 和 Publish over SSH插件实现war包自动部署到docker

    在 docker:(3)docker容器挂载宿主主机目录 中介绍了运行docker时的一个重要命令 -v sudo docker run -p : --name tomcat_xiao_volume ...

  3. windows 堆管理

    windows堆管理是建立在虚拟内存管理的基础之上的,每个进程都有独立的4GB的虚拟地址空间,其中有2GB的属于用户区,保存的是用户程序的数据和代码,而系统在装载程序时会将这部分内存划分为4个段从低地 ...

  4. 内网IP无法访问

    就是我们在3类地址中常见到内网的IP段. 10.0.0.0--10.255.255.255 172.16.0.0--172.31.255.255 192.168.0.0--192.168.255.25 ...

  5. React-Native 学习笔记-Android开发平台-开发环境搭建

    详细步骤请查看官网对应文档,BUT,有些注意事项请注意! 1,优先安装Node.js,因为后面可以使用npm安装软件, 2,注意不要使用CNPM!!!!!!!!! 3,Android Studio 请 ...

  6. 跟我一起读postgresql源码(十一)——Executor(查询执行模块之——Materialization节点(上))

    物化节点 顾名思义,物化节点是一类可缓存元组的节点.在执行过程中,很多扩展的物理操作符需要首先获取所有的元组后才能进行操作(例如聚集函数操作.没有索引辅助的排序等),这时要用物化节点将元组缓存起来.下 ...

  7. Beyond Globally Optimal: Focused Learning

    这里对WWW 2017文章<Beyond Globally Optimal: Focused Learning for Improved Recommendations>进行一个简单的分析 ...

  8. 网络编程(sock)搞定!

    前些日子写了一个网络编程的,纯新手,能优化的地方很多!但是,也算自己独立完成了这么一个东西,晚上发上来!!

  9. webpack学习之路

    当自己在学习webpack的时候,在网上发现中文的很详细的教程很少,于是便想将自己学习webpack的笔记记录整理下来,便有了这篇文章,希望对大家有所帮助,如果有错误,欢迎大家指出. 在我们开始之前 ...

  10. BZOJ:4333: JSOI2012 智者的考验

    4333: JSOI2012 智者的考验 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 68  Solved: 18[Submit][Status][ ...