【问题标题】:Python - any base to decimal (other2dec)Python - 任何基数到十进制(other2dec)
【发布时间】:2016-01-25 13:52:50
【问题描述】:

我因为一个问题而未能通过考试。任务是:

“设计一个程序,将任何数字从任何系统转换为十进制。
我们限制在 2 到 22 范围内的系统。”

所以我来了。我知道二进制[2]、八进制[8]、十进制[10] 和十六进制[16] 系统。每个转换系统都有1分,所以它必须是一个转换器:

2->10
3->10
...
22->10

我不知道这怎么可能。考试后我问我的教授怎么做,他说:“只是 x 的 y 次方,乘以,就是这样。所有的规则都是一样的。”

我可能听错了,因为我处于考试后的意识状态。大佬们有什么办法解决吗?

我看到在 stackoverflow 上已经有一些类似的问题,但没有一个不能像我的教授所说的那样解决问题。另外,我们大约 4 个月前开始学习 Python,但我们还没有学习到回复中实现的一些选项。

"""IN
str/int,任意基数[2-22]
OUT
十进制整数或浮点数"""

【问题讨论】:

  • This 应该可以帮助您理解教授所说的内容
  • 这里不是你解决家庭作业/任务的地方。向我们展示您的尝试,您知道如何在不使用计算器/计算的情况下更改数字的基数吗?
  • 你试过什么?提示:如果我给你这个数字,并告诉你,它以 4 为底,你能算出它的十进制等价物是多少吗? 313223 你是怎么做到的?
  • 您也可以只使用int(str, x) 这会将字符串的基数 x 转换为基数 10
  • @Jeremy 这一个学习的地方。如果这个问题stackoverflow.com/questions/2267362/… 有优点(在撰写本文时有 148 票和 53 个最喜欢的分数),那么我认为这个问题也有优点。有关基地的有用信息,请查看cs.stackexchange.com/questions/10318/…

标签: python decimal base any


【解决方案1】:

int() 内置函数支持将任意数字转换为任意基数。它需要在基数内传递正确的数字,否则会抛出 ValueError

语法:int('string', base) 转换为十进制

例子:

数字 3334 到基数 5 的转换

>>> int('3334',5)

469

数字 3334 到基数 9 的转换

>>>int('3334', 9)

2461

上述转换为十六进制数

>>>hex(int('3334', 9))

'0x99d'

【讨论】:

  • 内置插件应该是首选并尽可能使用,所以在我看来这是正确的答案。
  • 在 python 中 int() 总是以 10/十进制显示/返回数字,因此 int('3334', 5) 不是将 3334⏨ 转换为 469₅,它实际上是将 3334₅ 转换为 469⏨,对于其他示例也是如此。 469 不能是基数为 5 的数字,因为它包含数字 6 和 9。我在 python docs 中找不到返回类型基数的提及,但通过其他方式转换将证明这一点。示例的标题混淆了这一点
【解决方案2】:

我刚刚编写了答案,但是太慢了。此代码完全遵循 daTokenizers 解决方案

def converter(number, base):
    #split number in figures
    figures = [int(i,base) for i in str(number)]
    #invert oder of figures (lowest count first)
    figures = figures[::-1]
    result = 0
    #loop over all figures
    for i in range(len(figures)):
        #add the contirbution of the i-th figure
        result += figures[i]*base**i
    return result

converter(10,22)
>>> 22

converter(52,16)
>>> 82

【讨论】:

  • 需要修正缩进。如图所示,它不是合法的python。
  • 谢谢,复制后没有检查。这个编辑后的版本应该可以做到
  • 谢谢,你的代码看起来很不错,我明白了。这真的是我一直在寻找的。没想到这么简单。
  • 请注意,这不适用于其中包含字母的数字,例如十六进制数字“A”。它给了ValueError: invalid literal for int() with base 10: 'A'。要使其正常工作,您可能需要添加:if base<=10: figures = [int(i) for i in str(number)]else: figures = [int(i,base) for i in str(number)]
【解决方案3】:

基本阶段是这样的:

  1. 了解您所处的基础(据我了解,这是作为 var 提供给您的)
  2. 对于输入数字中的每个字符,将其乘以位置的底数。所以 "654",base 17 -> "6*17^2 + 5*17^1 + 4*17^0"
  3. 总和就是你的答案。

【讨论】:

  • 我删除了之前的评论,我的错。你说的对!谢谢!
【解决方案4】:

如果 n 是数字,要将基数“其他”转换为十进制,请尝试以下操作:

>>> other2dec = lambda n, other:  sum([(int(v) * other**i) for i, v in enumerate(list(str(n))[::-1])])
>>> other2dec(71,8)
57
>>> other2dec(1011,2)
11

【讨论】:

  • 嗯,这并不像我想象的那么简单,但它很简短,而且效果非常好。现在我将坐下来看看这段代码,试图理解一切。非常感谢!
  • SirParselot 的建议 int(str, x) 是您正在寻找的答案。欲了解更多信息:stackoverflow.com/questions/209513/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 2023-03-19
  • 2023-03-14
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
相关资源
最近更新 更多