0

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

4

5 回答 5

2

我如何告诉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
于 2013-01-22T13:37:27.173 回答
1

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 * bcd, b * acd, c * abd,d * abc

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

同样,我们可以与 进行ac * bd = 100ab + 10(ad+bc) + bd比较ad * bc = 100ab + 10(ac+bd) + cd。我们宁愿有更多的大副本a,所以第二个获胜。

最后我们需要与a * bcd = 100ab + 10ac + ad比较ad * 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
于 2013-01-22T14:08:25.943 回答
1

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

如果是这样,请参阅@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')
于 2013-01-22T14:10:37.987 回答
1

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

O(n lg n) 解决方案将是:

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

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

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

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

于 2013-01-22T14:16:52.647 回答
0

我假设您将数字作为字符串获取,因此您可以简单地剥离它们,加入并转换为 int:

string = "5*6*7*2"
value = int( "".join(string.split('*')) )
# value == 5672
于 2013-01-22T13:52:23.203 回答