python十进制正整数和任意进制互转

开发过程中遇到这个功能,由于输入比较简单,不要求要考更复杂的场景,于是把对应简单的实现记录一下.

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import math

def decimal2arbitrarybase(decimal_num: int, base: int) -> list[int]:
    if decimal_num < 0 or base <= 0:
        raise ValueError(f'not valid')
    if decimal_num == 0:
        return [0]
    res = []
    while decimal_num:
        res.append(decimal_num % base)
        decimal_num = decimal_num // base
    return res[::-1]

def arbitrarybase2decimal(arbitray: list[int], base: int) -> int:
    if len(arbitray) == 0 or base <= 0:
        raise ValueError(f'not valid')
    for item in arbitray:
        if item < 0:
            raise ValueError(f'not valid')
    res = 0
    for idx, val in enumerate(arbitray[::-1]):
        res += val*(base ** idx)
    return res

if __name__ == '__main__':
    print(decimal2arbitrarybase(10, 2))
    print(arbitrarybase2decimal([1,0,1,0], 2))
### Python中实现十进制任意进制转换的方法 在Python中,可以采用多种方式来完成十进制数到任意进制数的转换。以下是几种常见的方法及其原理。 #### 方法一:基于内置函数的简单转换 对于整数部分,Python提供了几个内置函数可以直接用于二进制、八进制十六进制的转换: - `bin()` 函数用于将整数转换为二进制表示形式。 - `oct()` 函数用于将整数转换为八进制表示形式。 - `hex()` 函数用于将整数转换为十六进制表示形式。 这些函数适用于特定的进制转换需求[^2]: ```python decimal_number = 255 binary_representation = bin(decimal_number)[2:] # 去掉前缀 '0b' octal_representation = oct(decimal_number)[2:] # 去掉前缀 '0o' hexadecimal_representation = hex(decimal_number)[2:].upper() # 去掉前缀 '0x' 并转为大写 print(f"Binary: {binary_representation}") print(f"Octal: {octal_representation}") print(f"Hexadecimal: {hexadecimal_representation}") ``` 然而,这种方法仅限于固定的几类进制转换,无法满足更广泛的N进制转换需求。 --- #### 方法二:通用算法实现十进制任意进制的转换 为了支持任意进制(如三进制、五进制等),可以通过编写自定义函数来实现这一目标。下面是一个典型的实现方案[^3]: ```python def decimal_to_n_base(number, base): """ 将十进制数 number 转换为指定进制 base 的字符串表示形式。 参数: number (int): 需要转换的十进制正整数。 base (int): 目标进制(范围为2~16)。 返回: str: 对应的目标进制字符串。 """ digits = "0123456789ABCDEF" result = "" if number == 0: return "0" is_negative = False if number < 0: is_negative = True number = abs(number) while number > 0: remainder = number % base result += digits[remainder] number //= base if is_negative: result += '-' return result[::-1] # 测试示例 number = int(input("请输入一个十进制数:")) base = int(input("请输入目标进制(>=2):")) converted_result = decimal_to_n_base(number, base) print(f"{number} 转换成 {base} 进制的结果是:{converted_result}") ``` 上述代码通过不断取余操作提取每一位上的数值,并映射到对应的字符集上形成最终结果。此方法能够处理负数以及较大的基数情况。 --- #### 方法三:改进版Conversion函数 另一种更为简洁的方式是对已有的一些经典算法进行优化调整。例如,在`aaronthon`提出的`conversion`基础上稍作修改后得到如下版本[^4]: ```python def conversion(num, radix): """Converts an integer to any given base.""" chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" sign = '-' if num < 0 else '' num = abs(num) res = '' if num == 0: return '0' while num != 0: digit = num % radix res = chars[digit] + res num //= radix return sign + res # 使用实例 num = -255 radix = 16 result = conversion(num, radix) print(result) # 输出 "-FF" ``` 这种设计不仅保持了逻辑清晰易懂的特点,还增强了灵活性与扩展性。 --- ### 总结 综上所述,无论是借助Python自身的强大工具还是手动构建解决方案,都可以高效地达成从十进制向其他各类进制转变的目的。选择何种途径取决于实际应用场景的具体要求个人偏好。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值