The Fun Of Algorithm - Day10 -数制转换

本文介绍如何实现M进制数向非M进制的转换,包括概念解析、算法设计,涉及字符与数字的转换、按权展开相加和除基数取余方法,并提供Python代码实例。通过实例演示了十六进制和十进制、八进制之间的转换,以及如何处理多组数据输入验证程序的准确性。
摘要由CSDN通过智能技术生成

问题描述

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

问题分析

概念:
基数: 在一种数制中,只能使用一组固定的数字来表示数的大小。具体使用多少个不同数字来表示一个数值的大小,就称为该计数制的基数(base)。如十进制基数为10,二进制基数为2等。
权:又称为位权或权值, 即每一个数位都有一个固定的基值与之相对应。如十进制的个位对应的权值为1( 1 0 0 10^0 100),十位对应的权值为10( 1 0 1 10^1 101),百位对应的权值为100( 1 0 2 10^2 102),对于一个M进制的数来说,小数点左边各位上对应的权值从左到右分别为基数的0次方,基数的1次方,基数的2次方等,对于小数点右边各位上对应的权值从右到左分别为基数的-1次方,基数的-2次方等。

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

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

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

算法设计

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

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

字符与数字进行转换

0~9 利用ASCII码之间的对应关系。字符’0’对应ASCII为48,字符’1’对应ASCII的49, 所以’1’-‘0’ =1(在0-127之间字符型和整型是可以通用的)得到的差即为字符ch对应的数字
A-Z, 字符‘A’对应数字10,字符‘B’对应数字11, 依次类推。

int(x) 将其他类型转换成数字
ord(x) 将字符转换成对应的Unicode码
str(x) 将其他类型转换成字符串
chr(x) 将十进制数字转换成对应的字符

其他数制转换成十进制

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

十进制转换成其他数制

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

更详细的进制转换方法参考 https://wenku.baidu.com/view/800e80ee998fcc22bcd10d35.html

Code

# !/user/bin/python3
# -*- coding: utf-8 -*-
# @author: HHVic
# @desc: 数制转换

import time

# add timer to calculate the performance
# Basic performance
###############################################################

start = time.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,object):  #十进制转换为其他进制
    decimal=[]
    while decimal_num: #求余数并转换为字符
        decimal.append(num_to_char(decimal_num%object))
        decimal_num//=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: #利用输入的flag值控制循环是否结束
        print('转换前的数是:', end='')
        temp=input()
        print('转换前的数制是:', end='')
        source=int(input())
        print('转换后的数制是:', end='')
        object=int(input())
        print('转换后的数是:', end='')
        decimal_num=source_to_decimal(temp,source)
        decimal=decimal_to_object(decimal_num,object)
        output(decimal)
        print('继续请输入1,否则请输入0:')
        flag=int(input())

end = time.time()
print("The Basic Runtime is {0}".format((end-start)))

结果:

转换前的数是:1015
转换前的数制是:8
转换后的数制是:10
转换后的数是:525
继续请输入1,否则请输入01
转换前的数是:1015
转换前的数制是:8
转换后的数制是:16
转换后的数是:20
继续请输入1,否则请输入0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值