Python中的基本转换器

时间:2014-11-14 11:43:22

标签: python

我正在编写一个程序,可以在Python中将任何基数转换为基数10。该计划的代码如下所示。

print("Enter the number you want to convert to base 10: ")
number = input()
"""length of the digit entered"""
length = len(number)
print("Enter the base of the number: ")
base = input()

for i in range(len(number)):
    length = length - 1
    """Computes the sum for each digit"""
    s = number[i] * (int(base) ^ length) 
    s += s
print(s)

问题在于,对于我输入的任何数字,答案总是1111.欢迎任何有关如何解决此问题的建议。

3 个答案:

答案 0 :(得分:5)

^bitwise XOR operator,而不是权力运算符。在Python中power operator is **

s = number[i] * (int(base) ** length)

还有其他错误; s += s只是s *= 2,你在那里加倍。您可能希望从循环中的s = 0 开始循环然后总结为:

s = 0
for i in range(len(number)):
    length = length - 1
    """Computes the sum for each digit"""
    s += number[i] * (int(base) ^ length) 

但您尚未将number[i]转换为实际的数值。

您需要在此处从“数字”到数值的映射:

digits = {c: i for i, c in enumerate('0123456789abcdefghijklmnopqrstuvwxyz')}

这会创建一个从字符串数字到数值的字典映射,因此'7'映射到7f映射到15,等等。为您提供一直到映射的映射36。

现在您可以使用digits从字符串数字映射到数值:

s = 0
base = int(base)
for i, digit in enumerate(reversed(number.lower())):
    s += digits[digit] * (base ** i) 

我在这里颠倒了数字的处理;更容易从小到大。 enumerate()为我们提供了一个索引计数,您可以将直接循环到number以产生字符,而不是使用range()并将索引编入number。我将number小写,以便aA都表示10在那么高的基数中。

然后可以将其转换为函数中的单行:

digits = {c: i for i, c in enumerate('0123456789abcdefghijklmnopqrstuvwxyz')}

def parse_number(number, base):
    return sum(digits[digit] * (base ** i)
               for i, digit in enumerate(reversed(number.lower())))

print(parse_number(number, int(base)))

答案 1 :(得分:0)

要查找任何数字的值,您不仅需要知道它的位置和基数,还需要知道可能数字的设置和排序。在代码中:

s = number[i] * (int(base) ^ length) 

我没有看到从数字number[i]的字符表示转换为数字值。它之后的行甚至更奇怪,因为你只需加倍s,而不是收集一个值的总和。

(作为旁注,Python的int类型已经处理了从2到36的基数。)

仅仅因为练习很有趣,这里的方法略有不同:

import string

number = input("Enter a number: ")
base = int(input("Enter the base: "))
digits = (string.digits+string.ascii_lowercase)[:base]

result = 0
for digit in number.lower():
    result = result*base + digits.index(digit)

print(result)

答案 2 :(得分:0)

这将从任何基数(提供基数 <= 36)转换为任何基数(相同限制),默认输出基数为 10

def changebase(n, base=10, to=10):
    '''
    params:
      n     - number to convert
      base  - current base of number
      to    - desired base, must be <= 36
    '''
    # check that bases are <= 36
    if to > 36 or base > 36:
        raise ValueError('max base is 36')

    # convert to base 10
    n = int(str(n),base)
    positive = n >= 0

    # return if base 10 is desired
    if to == 10:
        return str(n)

    # convert to new base
    n = abs(n)
    num = []
    handle_digit = lambda i: str(i) if i < 10 else chr(i+55)
    while n > 0:
        num.insert(0, handle_digit(n % to))
        n = n // to

    # return string value of n in new base
    return ''.join(num) if positive else '-' + ''.join(num)