我正在编写一个程序,可以在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.欢迎任何有关如何解决此问题的建议。
答案 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'
映射到7
,f
映射到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
小写,以便a
和A
都表示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)