当前位置: 首页 > news >正文

Python算法100例-1.10 数制转换

完整源代码项目地址,关注博主私信’源代码’后可获取

  • 1.问题描述
  • 2.问题分析
  • 3.算法设计
  • 4.确定程序框架
  • 5.字符与数字进行转换
  • 6.其他数制转换成十进制
  • 7.十进制转换成其他数制
  • 8.完整的程序

1.问题描述

给定一个M进制的数x,实现对x向任意一个非M进制的数的转换。

2.问题分析

掌握不同数制间的转换关系是解决本题的关键,这里所说的数制一般包括二进制、八进制、十六进制及十进制。除了不同的数制之外,还有几个必须要了解的概念:

·基数:在一种数制中,只能使用一组固定的数字来表示数的大小。具体使用多少个不同的数字来表示一个数值的大小,就称为该计数制的基数(Base)。如十进制的基数为10、二进制的基数为2等。

·:又称为位权或权值,即每一个数位都有一个固定的基值与之相对应。如十进制的个位对应的权值为1(100),十位对应的权值为10(101),百位对应的权值为100(102),对于一个M进制的数来说,小数点左边各位上对应的权值从左到右分别为基数的0次方、基数的1次方、基数的2次方等,对于小数点右边各位上对应的权值从右到左分别为基数的-1次方、基数的-2次方等。

二进制、八进制、十六进制向十进制转换的方法为:按权展开相加

十进制转换成二进制、八进制、十六进制的方法为:整数部分除以基数取余数(取余的方向为从后向前),小数部分乘以基数取整数(取整的方向为从前向后)

二进制、八进制、十六进制相互转换的方法为:先转换成十进制再转换成其他进制;或者按照其对应关系进行转换(3位二进制数对应一位八进制数,4位二进制数对应一位十六进制数)。

本题按照前一种转换方式进行编程。

3.算法设计

十六进制是由0~F这一组固定的数字来表示的,所以采用字符数组进行存储。在进行输入、输出时,数组元素都是以字符的形式存在的,但是在进行数制转换时数组元素又以数字的形式存在,程序中我们用两个自定义函数*char_to_number()number_to_char()*来实现字符与其对应数字之间的转换。

在执行程序时我们希望可以输入多组数据来验证程序的正确性,以前的程序都是多次运行,输入不同的数据来实现。我们对程序稍做改进,使只运行一次程序但可以输入多组数据进行验证。解决这个问题只需要加一层循环,如果循环条件为真则继续输入数据,否则退出。循环条件为真即表达式的值不为0,这样我们可以利用一个变量假设为flag,利用语句“while flag:循环体”来进行控制,当flag的值为1时我们可以接着输入,若为0则结束循环。

4.确定程序框架

程序主体框架如下:

if __name__ == '__main__':MAXCHAR = 101                                   # 允许的最大字符串长度flag = 1                                        # 存储是否退出程序的标志while flag:                                     # 利用输入的flag值控制循环是否结束# 将原数转换成十进制数# 求出转换成目标数制后字符数组的长度# 逆序打印字符数组print("继续请输入1,否则输入0:")flag = int(input())

5.字符与数字进行转换

将输入或存储的字符转换为对应的数字,可以分两类进行考虑:第一类是介于’0’到’9’之间的字符,转换成相应的数字0~9时,可利用其ASCII码之间的对应关系。字符’0’的ASCII码为48,'1’的ASCII码为49,‘1’-‘0’=1(在0~127之间字符型与整型是可以通用的)得到的差即为字符ch对应的数字。第二类是介于’A’到’Z’之间的字符,字符’A’对应的数字为10,'B’对应的数字为11,其他字母以此类推。

值得高兴的是,Python为我们提供了以下函数,用于实现数字、字母和字符之间的转换

  ·int(x):将其他类型转换成数字。

  ·ord(x):将字符转换成对应的Unicode码。

  ·str(x):将其他类型转换成字符串。

  ·chr(x):将十进制数字转换成对应的字符。

将字符转换成数字,代码如下:

# 将字符转换成数字
def char_to_num(ch):if ch >= '0' and ch <= '9':return int(ch)                              # 将数字字符转换成数字else:return ord(ch)                              # 将字母字符转换成数字# 将数字转换为字符
def num_to_char(num):if num >= 0 and num <= 9:return str(num)                     # 将0~9之间的数字转换成字符else:return chr(num)                     # 将大于10的数字转换成字符

6.其他数制转换成十进制

其他数制转换成十进制,采用按权展开相加的方法,所以需要定义一个变量来存储相加之后的和,假设变量为decimal_num。因数组元素类型为字符型,所以首先需要调用*char_to_num(temp[i])*函数将元素类型转化成数值型然后参与运算。

定义source_to_decimal()函数来完成数值转换,该函数代码如下:

# 其他数制转换为十进制
def source_to_decimal(temp, source):decimal_num = 0                                 # 存储展开之后的和for i in range(len(temp)):      # 累加decimal_num=(decimal_num * source)+char_to_num(temp[i])return decimal_num

7.十进制转换成其他数制

十进制转换成其他数制,采用除以基数取余的方法。以十进制转换成八进制为例,首先用当前的十进制数除以要转换成的数制的基数8,得到的余数存放在数组元素decimal中,为了使余数的类型由数值型转换成字符型,需调用*num_to_char(decimal_num%object)*函数,将相除之后的十进制数再次赋值给存储原数据的变量decimal_num;然后用得到的新十进制数再去除基数,将余数转换成字符型存入decimal数组中;一直重复上述过程,直到原来的十进制数为0。

定义函数decimal_to_object()来实现上述功能,其代码如下:

# 十进制转换为其他数制
def decimal_to_object(decimal_num, object):decimal = []while decimal_num:# 求出余数并转换为字符decimal.append(num_to_char(decimal_num % object))decimal_num //= object                              # 用十进制数除以基数return decimal

由余数组成的新数制数与余数的顺序是相反的,所以在输出新数的时候我们采用的是逆序输出的方式,定义output()函数用于完成新数的输出,代码如下:

# 修改余数数制
def output(decimal):f = len(decimal)-1while f >= 0:print(decimal[f], end='')f -= 1print()

8.完整的程序

完整的程序如下:

%%time
# 数制转换# 将字符转换成数字
def char_to_num(ch):if ch >= '0' and ch <= '9':return int(ch)                              # 将数字字符转换成数字else:return ord(ch)                              # 将字母字符转换成数字# 将数字转换为字符
def num_to_char(num):if num >= 0 and num <= 9:return str(num)                     # 将0~9之间的数字转换成字符else:return chr(num)                     # 将大于10的数字转换成字符# 其他数制转换为十进制
def source_to_decimal(temp, source):decimal_num = 0                                 # 存储展开之后的和for i in range(len(temp)):      # 累加decimal_num=(decimal_num * source)+char_to_num(temp[i])return decimal_num# 十进制转换为其他数制
def decimal_to_object(decimal_num, v_object):decimal = []while decimal_num:# 求出余数并转换为字符decimal.append(num_to_char(decimal_num % v_object))decimal_num //= v_object              # 用十进制数除以基数return decimal# 修改余数数制
def output(decimal):f = len(decimal)-1while f >= 0:print(decimal[f], end='')f -= 1print()if __name__ == '__main__':MAXCHAR = 101                                   # 允许的最大字符串长度flag = 1                                        # 存储是否退出程序的标志while flag:    temp = input()                                 # 利用输入的flag值控制循环是否结束print(f"转换前的数是:{temp}", end='\n')source = int(input())print(f"转换前的数制是:{source}", end='\n')v_object = int(input())print(f"转换后的数制是:{v_object}", end='\n')decimal_num = source_to_decimal(temp, source)decimal = decimal_to_object(decimal_num, v_object)print("转换后的数是:", end=' ')output(decimal)print("继续请输入1,否则输入0:")flag = int(input())
转换前的数是:15
转换前的数制是:16
转换后的数制是:10
转换后的数是: 21
继续请输入1,否则输入0:
转换前的数是:10
转换前的数制是:8
转换后的数制是:16
转换后的数是: 8
继续请输入1,否则输入0:
转换前的数是:85
转换前的数制是:10
转换后的数制是:8
转换后的数是: 125
继续请输入1,否则输入0:
转换前的数是:20
转换前的数制是:10
转换后的数制是:2
转换后的数是: 10100
继续请输入1,否则输入0:
CPU times: user 562 ms, sys: 165 ms, total: 726 ms
Wall time: 1min 21s

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Stable Diffusion 模型下载:Dark Sushi Mix 大颗寿司Mix
  • java面试多线程篇
  • 深度学习图像算法工程师--面试准备(1)
  • 【后端高频面试题--设计模式下篇】
  • python毕设选题 - 大数据二手房数据爬取与分析可视化 -python 数据分析 可视化
  • (14)Hive调优——合并小文件
  • 【递归】:原理、应用与案例解析 ,助你深入理解递归核心思想
  • 深度学习基础——卷积神经网络(一)
  • linux安装mysql8且初始化表名忽略大小写
  • c语言游戏实战(9):球球大作战
  • 网站管理新利器:免费在线生成 robots.txt 文件!
  • 51-2 万字长文,深度解读端到端自动驾驶的挑战和前沿
  • MVC 、DDD(domain-driven design,软件主动学习业务)、中台、Java SPI(Service Provider Interface)
  • 人工智能学习与实训笔记(七):神经网络之模型压缩与知识蒸馏
  • vue3 之 商城项目—会员中心
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 时间复杂度分析经典问题——最大子序列和
  • [nginx文档翻译系列] 控制nginx
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Angular 响应式表单之下拉框
  • AWS实战 - 利用IAM对S3做访问控制
  • download使用浅析
  • echarts花样作死的坑
  • java小心机(3)| 浅析finalize()
  • MaxCompute访问TableStore(OTS) 数据
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • rabbitmq延迟消息示例
  • swift基础之_对象 实例方法 对象方法。
  • Twitter赢在开放,三年创造奇迹
  • Vue--数据传输
  • vue--为什么data属性必须是一个函数
  • 第十八天-企业应用架构模式-基本模式
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 前端面试题总结
  • 前端性能优化--懒加载和预加载
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 用jquery写贪吃蛇
  • 智能网联汽车信息安全
  • - 转 Ext2.0 form使用实例
  • 阿里云ACE认证之理解CDN技术
  • ​ArcGIS Pro 如何批量删除字段
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #NOIP 2014#Day.2 T3 解方程
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • ${ }的特别功能
  • (1)Android开发优化---------UI优化
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (33)STM32——485实验笔记
  • (39)STM32——FLASH闪存
  • (二)构建dubbo分布式平台-平台功能导图