Python算法100例-1.10 数制转换

news2024/9/22 22:28:47

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

  • 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)-1
    while f >= 0:
        print(decimal[f], end='')
        f -= 1
    print()

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)-1
    while f >= 0:
        print(decimal[f], end='')
        f -= 1
    print()

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1463888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SwiftUI 集合视图(Grid)拖放交换 Cell 的极简实现

概览 自从 SwiftUI 横空出世那天起&#xff0c;小伙伴们都感受到了它惊人的简单与便捷。而在本课中&#xff0c;我们将会用一个小“栗子”更直观的让大家体验到它无与伦比简洁的描述性特质&#xff1a; 如上图所示&#xff0c;我们在 SwiftUI 中实现了 Grid 中拖放交换 Cell 的…

开开开开开,干

大家新年快乐&#xff0c;开工啦啦啦啦 其实每天很多人都会问&#xff1a; 有协同过滤的算法吗&#xff0c;有的&#xff0c;可以给你解释原理… 有的小伙伴只开了一部分逻辑&#xff0c;我要实现用户可以下单功能 但是细细考虑下单&#xff0c;需要现有用户&#xff0c;维护…

[Git] 配置Access Token 解决Github 认证弹窗

[Git] 配置Access Token 解决Github 认证弹窗 1. 前言2. 解决2.1 申请Personal Access Token2.2. 配置Token2.3. 授权激活Token 博主热门文章推荐&#xff1a; 1. 前言 最近从bitbucket切换到了Github Enterprise, 刚使用几次发现 每次操作 都有弹窗认证&#xff0c; 虽然手动点…

波奇学Linux:进程通信管道

进程通信 管道&#xff1a;基于文件级别的单向通信 创建父子进程&#xff0c;使得进程的struct file*fd_array[]的文件描述符指向同一个struct file文件&#xff0c;这个文件是内存级文件。 父进程关写端&#xff0c;子进程再关闭读端。实现单向通信 子进程写入&#xff0c;父进…

个人博客搭建

使用彩虹云主机百度云域名WordPress 下载WordPress https://cn.wordpress.org/ 购买主机 购买彩虹云主机&#xff0c;购买香港高防主机https://www.cccyun.net/ 购买之后点击 管理 进入后点 击前往控制面板 -> 一键登录控制面板 可进入控制面板。 选择文件管理 在线…

cuda加速:memory coalescing,Bank Conflicts

cuda加速&#xff1a;memory coalescing 1.memory coalescing2.Shared Memory Bank Conflicts参考文献 1.memory coalescing 参考【1】中给出的定义&#xff1a;一个warp中&#xff0c;thread 0到thread 31访问连续的内存空间&#xff0c;则这些线程的访问被合并为一次访问。 …

2.21学习总结

1.【模板】ST 表 2.Balanced Lineup G 3.景区导游 4.最近公共祖先&#xff08;LCA&#xff09; 倍增思想&#xff1a;主要用于LCA问题&#xff0c;RMQ问题。在进行 递推 时&#xff0c;如果 状态空间很大&#xff0c;通常的 线性递推 无法满足 时间 与 空间复杂度 的要求&…

BabylonJS 6.0文档 Deep Dive 动画(一):动画介绍

1. 动画介绍 无论动画如何实现&#xff0c;它都必须考虑所需的动作、时间、产生所需流动性所需的帧数以及序列中的关键点。这个介绍应该有助于理解Babylon.js是如何进行动画的&#xff0c;以及它们是如何实现的。 动画由一系列图像、帧生成&#xff0c;这些图像、帧一个接一个地…

做跨境电商,为什么要建独立站,2024年的机会在哪里?一次性讲清楚...

做跨境电商&#xff0c; 是选择依托第三方平台&#xff1f; 还是自建独立网站&#xff1f; 01 什么是自建独立站 最简单的说法&#xff1a;独立站对于我们跨境电商这个行业来说&#xff0c;就是那些不是主流平台的网站&#xff0c;是某个企业或者个人自己做和运营的搭建电商…

记录一次调用奇门api报错信息Invalid signature (签名无效)

奇门有msg对应错误的记录 我可能是 3.1 以下是还原场景 第一个方法 private static String getSellerItem() throws IOException {Map<String, String> params new HashMap<String, String>();// 公共参数params.put("page_index", "100"…

如何用USB服务器解决网银U盾连接管理问题?好用吗?

反复插拔效率低、分散管理隐患大 随着信息化建设的深入推进&#xff0c;网银U盾已经成为企业办公中不可或缺的工具。然而&#xff0c;在使用U盾的过程中&#xff0c;常常会遇到一些问题&#xff0c;其中最突出的问题之一就是U盾的连接和管理问题。反复插拔效率低、分散管理隐患…

Leetcode - 周赛385

目录 一&#xff0c;3042. 统计前后缀下标对 I 二&#xff0c;3043. 最长公共前缀的长度 三&#xff0c;3044. 出现频率最高的质数 四&#xff0c;3045. 统计前后缀下标对 II 一&#xff0c;3042. 统计前后缀下标对 I 该题数据范围小&#xff0c;可直接暴力求解&#xff0c;…

18.贪心算法

排序贪心 区间贪心 删数贪心 统计二进制下有多少1 int Getbit_1(int n){int cnt0;while(n){nn&(n-1);cnt;}return cnt; }暴力加一维前缀和优化 #include <iostream> #include <climits> using namespace std; #define int long long const int N2e510; in…

利用AI做Q版影视剧人物头像,轻松涨粉过万

粉丝在问,能不能出一个SD制作热播影视剧Q版人物的教程。刚好我最近也刷到了几个号,对这方面也感兴趣,于是去研究了出图的逻辑。热播电视剧的Q版人物,一方面不缺流量,IP也能带来一波回忆杀。 下面这组图是一只小鹿鸭的作品,在某音和某书都有很好的数据。 公众号刷到了一组…

128.乐理基础-五线谱-纯四度、纯五度

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;127.乐理基础-五线谱-纯一度、纯八度-CSDN博客 上一个内容里练习的答案&#xff1a; 纯四度、纯五度的结论 纯四度例子&#xff1a; 例子1&#xff1a; 例子2&#xff1a; 纯四度两个条件&#xff0c;音数是2.5&a…

微信小程序开发学习笔记——2.10video视频组件及uniCloud云存储网络地址用法

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a; https://www.bilibili.com/video/BV19G4y1K74d?p13&vd_source9b149469177ab5fdc47515e14cf3cf74 一、最简单的放video的例子 视频尽量不要放本…

华为OD机试真题-整数对最小和-2023年OD统一考试(C卷)-- Python3-开源

题目&#xff1a; 考察内容&#xff1a;双循环sortsum 代码&#xff1a; """ 题目分析&#xff1a; 求随机组合最小和 输入&#xff1a; 数组a个数&#xff0c; 数组元素 数组b个数&#xff0c;数组元素 对数个数输出&#xff1a; 和的最小值3 1 1 2 3 1 2 3…

【GPTs分享】每日GPTs分享之Canva

简介 Canva&#xff0c;旨在帮助用户通过Canva的用户友好设计平台释放用户的创造力。无论用户是想设计海报、社交媒体帖子还是商业名片&#xff0c;Canva都在这里协助用户将创意转化为现实。 主要功能 设计生成&#xff1a;根据用户的描述和创意需求&#xff0c;生成定制的设…

Java Z 垃圾收集器 (ZGC):彻底改变内存管理

欢迎来到百战百胜&#xff01;我们致力于为广大IT从业者、学生和爱好者提供全面、实用的资源和服务。加入我们的聊天群&#xff0c;这里有专业大佬为你提供有价值的建议和指导&#xff01; 微信搜索&#xff1a;IT开DD那点小事 更多访问&#xff1a;www.besthub.tech Z 垃圾收集…

【LeetCode】63. 不同路径 II(中等)——代码随想录算法训练营Day39

题目链接&#xff1a;63. 不同路径 II 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。…