【问题标题】:A number out of digits [closed]一个数字中的数字[关闭]
【发布时间】:2013-01-22 13:34:54
【问题描述】:

我想知道将用户输入的数字相乘可以得到的最大数字是多少: 5*6*7*2 或 567*2 或 67*25 ...等 所以 5/6/7/2 应该由用户作为变量输入,但是我如何告诉 python 从两个变量中形成一个数字(将两个数字并排放置,并将结果本身视为一个数字)。

【问题讨论】:

  • 我会说它是7652(所有数字连接在一起),除非你可以使用求幂 - 然后它是2^5^6^7(从右到左计算)。
  • 你说数字被输入到变量中,但它们是作为数字还是字符串存储在这些变量中?
  • @JanDvorak 是正确的。最大的结果总是通过连接所有数字来获得。
  • @mbeckish:没错。如果您必须使用至少一个乘法怎么办?在那种情况下解决方案也很简单吗?
  • @mbeckish - I'm pretty sure you should multiply the biggest digit by the rest of the digits concatenated - 一开始我也是这么想的,但看起来这不是最大的可能数字。看看下面的证明。

标签: python numbers digits


【解决方案1】:

我如何告诉python从两个变量中形成一个数字(将两个数字并排放置,并将结果本身视为一个数字)

如果这两个数字存储在整数变量中,下面会这样做:

In [1]: v1 = 5

In [2]: v2 = 6

In [3]: v1 * 10 + v2
Out[3]: 56

这可以概括为一个数字序列:

In [7]: l = (1, 2, 6, 3)

In [8]: reduce(lambda x,y: x * 10 + y, l)
Out[8]: 1263

【讨论】:

  • 如果变量是字符串会产生一些意想不到的结果。
  • @JoachimPileborg:很公平。我添加了关于v1v2 类型的明确措辞。
  • 不是reduce,只是一种复杂的做法:int(''.join(map(str,l))) ?
  • @JonClements:这是一个数字问题,所以我更喜欢使用数字而不是字符串。当然,其他人可能更喜欢将数字表示为字符串。至于纯粹的可读性,我认为这是旁观者的看法。
  • 为什么还要将它们作为整数引入呢?如果您接受来自用户的变量,只需将它们作为字符串输入并连接即可。将操作次数减半。这种方式也更具可扩展性,因为使用 eval() 可以更容易地通过交换字符来执行多个操作,即你有 '567*2' 然后你可以将星号转换为 '56*72'。您只需要排列“5672*”即可尝试所有可能性。
【解决方案2】:

我觉得您在问题中发布了一个错误。你问排列?你确定吗?

如果是这样,请参阅@mbeckish 的回答。这很简单,不是很好的编程练习。

(然而,这是一个很好的技巧问题练习,解决方案像谜一样的“陷阱”)

更好的方法是放弃排列要求,以便输入的顺序实际上可以影响答案。对于这种方法,我们得到了一个更有趣的解决方案:

def largest_product(*args):
    numbers = ''.join(map(str, args))
    results = []
    for i in range(1, len(numbers) - 1):
        multicand  = int(numbers[:i])
        multiplier = int(numbers[i:])
        m, n = multicand, multiplier
        results.append(( m * n, "%s * %s" % (m, n)))
    return max(results)

>>> largest_product(*range(8))
(827115, '12345 * 67')

【讨论】:

  • 这个答案不正确。 1234567 的最大结果是 7654321(假设您可以连接所有 n 位数字)。如果必须乘以至少一位,那么最大的结果是 7*654321 = 4,580,247。
  • 通过使用排列,用户输入的意义很小(你已经证明了两次)。这种方法解决了一个不同的问题,即结果可能会有一些变化。我怀疑 OP 正在为学校解决问题,并且错误地发布了要求。我可能是错的,所以对否决票没有什么不好的感觉。
  • 我同意,这个问题很模糊。如果您对您的帖子进行任何细微修改,我会删除我的反对票。
  • 我做的不仅仅是一个小编辑。很好的收获。
【解决方案3】:

so 5/6/7/2 should be entered by the user as variables, but how do I tell python to form a number from two variables (putting the two digits next to each other and treating the outcome as a number by itself).

您的问题的根源似乎是从用户那里捕获数据,将其组合并转换:

>>> a = raw_input()
8
>>> b = raw_input()
3
>>> a
'8'
>>> b
'3'
>>> a + b
'83'
>>> int(a+b)
83

就这么简单。


现在就biggest number you can make from multiplying digits entered 而言...如果您愿意,我们可以用数学证明这一点,这样您就不必尝试一堆组合了:

我们可以对数字进行排序a >= b >= c >= d

首先让我们看看拆分数字31。我们需要比较a * bcdb * acdc * abdd * abc

比较a * bcd = 100ab + 10ac + adb * acd = 100ab + 10bc + bd,我们发现前者更大,因为a >= b。类似的论点将表明a * bcd 胜过其他人。

类似地,我们可以将ac * bd = 100ab + 10(ad+bc) + bdad * bc = 100ab + 10(ac+bd) + cd 进行比较。我们宁愿拥有更多大号a 的副本,所以第二个获胜。

最后我们需要比较a * bcd = 100ab + 10ac + adad * bc = 100ab + 10(ac+bd) + cd。第二个是赢家。

您可能将循环中的输入作为一个数组,所以如果您有:

(a)  arr[0] = '5'                  arr[0] = '7'
(b)  arr[1] = '6'     sort em  =>  arr[1] = '6'
(c)  arr[2] = '7'                  arr[2] = '5'
(d)  arr[3] = '2'                  arr[3] = '2'

最大的是:

int(arr[0] + arr[3]) * int(arr[1] + arr[2]) = 4680

【讨论】:

    【解决方案4】:

    任何让你尝试所有数字排列的解决方案都将非常低效,运行时间为 O(n!)。仅 14 位数字(和乘法运算符)将提供大约 1 万亿种组合!

    一个 O(n lg n) 的解决方案是:

    1. 将数字从高到低排序。
    2. 将它们连接成一个字符串。
    3. 打印字符串。

    如果你必须乘以至少一位数,那么

    1. 排序。
    2. 取最高位并乘以其余数字的串联。
    3. 打印结果。

    如果您必须乘以至少一位数,那么您可能需要尝试所有排列(请参阅@Mike 的回答)。

    【讨论】:

      【解决方案5】:

      我假设你得到的数字是字符串,所以你可以简单地剥离它们,加入并转换为 int:

      string = "5*6*7*2"
      value = int( "".join(string.split('*')) )
      # value == 5672
      

      【讨论】:

        猜你喜欢
        • 2013-05-25
        • 2013-01-06
        • 2014-05-18
        • 2016-08-21
        • 2013-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多