0

次のようにユーザーが入力した数字を乗算して作成できる最大の数を知りたい: 5*6*7*2 OR 567*2 OR 67*25 ...etc so 5/6/7/2ユーザーが変数として入力する必要がありますが、2 つの変数から数値を形成するように Python に指示するにはどうすればよいですか (2 つの数字を並べて、結果をそれ自体で数値として扱います)。

4

5 に答える 5

2

2つの変数から数値を形成するようにPythonに指示するにはどうすればよいですか(2桁を並べて、結果をそれ自体で数値として扱う)

2桁が整数変数に格納されている場合、次のようになります。

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

質問に間違いを投稿したようです。あなたは順列を求めますか?本気ですか?

もしそうなら、@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. それらを 1 つの文字列に連結します。
  3. 文字列を印刷します。

少なくとも 1 桁を掛ける必要がある場合は、

  1. 選別。
  2. 最上位の桁を取り、残りの桁の連結を掛けます。
  3. 結果を印刷します。

少なくとも 1 桁を乗算する必要がある場合は、すべての順列を試す必要がある場合があります (@Mike の回答を参照)。

于 2013-01-22T14:16:52.647 に答える
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

3まず、桁との分割を見てみましょう1a * bcd、、、、を比較する必要がb * acdありc * abdますd * abc

>=であるため、前者の方が大きいことがa * bcd = 100ab + 10ac + adわかります。同様の議論は、他の議論を打ち負かすことを示します。b * acd = 100ab + 10bc + bdaba * bcd

同様に、 と比較できac * bd = 100ab + 10(ad+bc) + bdますad * bc = 100ab + 10(ac+bd) + cd。大きい のコピーを増やしたいaので、2 番目の が勝ちます。

最後に と比較する必要がありa * bcd = 100ab + 10ac + adますad * bc = 100ab + 10(ac+bd) + cd。2番目が勝者です。

おそらくループ内の入力を配列として受け取ったので、次の場合:

(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 に答える
0

数値は文字列として取得されると想定しているので、単純にそれらを取り除き、結合してintに変換できます。

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