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 ...
随机推荐
- flex盒模型实现头部尾部固定
近期做移动app.wap等站,需要头部固定在顶部,不随着内容滚动而滚动平时第一想法就是使用position:fixed;top:0;z-index:10;这样去实现但这样使用fixed之后,会在ios ...
- wtforms快速使用和源码分析(基于flask)
wtforms 和django的form组件大同小异,下面给出一个应用举例以便快速查询. 开始使用 from flask import Flask, render_template, request, ...
- poi 读取word文档
1.导入jar包 官网下载地址: https://www.apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.zip 最开始 ...
- python实现XSS过滤(BeautifulSoup和白名单处理)
下面我做的莫名其妙的代码格式化是因为这个 --.-- 首先大致说一下XSS,就是在HTML里插入恶意的javascript代码,使得在该HTML加载时执行恶意代码,达到攻击的目的. 可能存在的地方呢, ...
- Linux经常使用的文件传输的几种方式
Linux经常使用的文件传输的几种方式 1.终端新建stfp协议连接 或者命令方式: sftp -P22 root@192.168.11.100 端口可以不用填写,默认是22,端口的P是大写. 将本地 ...
- 应用服务器GC回收常见问题总结
近一段时间多次发现因GC问题造成系统性能问题(应用服务间歇性响应缓慢.应用服务器CPU占用较高等),在此总结一下: 1.代码中直接调用GC.Collect() 2.字符串等操作频繁的内存申请 3.频繁 ...
- 深透清晰理解Java高并发概述
1.多线程安全性 多线程安全性的定义可能众说纷纭,但是其最核心的一点就是正确性,也就是程序的行为结果和预期一致. 当多个线程访问某个类时,不管运行环境采用何种线程调度算法或者这些线程如何交替执行,且不 ...
- struts2(三)之表单参数自动封装与参数类型自动转换
前言 对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化, struts2的 ...
- TSP(个人模版)
O(n^2)TSP: #include<stdio.h> #include<string.h> #include<algorithm> #include<io ...
- BZOJ 1432: [ZJOI2009]Function(新生必做的水题)
1432: [ZJOI2009]Function Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1205 Solved: 895[Submit][Sta ...