1

与えられた数字を使って、それらの数字に「5」、「2」、「1」がいくつ入るかを計算する必要があります。申し訳ありませんが、私の英語はこの種の説明のために少し制限されています:) 多分例はより良いです:

演習: print stamps(8) 結果は次のようになります: (1, 1, 1) (1 つの 5p スタンプ、1 つの 2p スタンプ、および 1 つの 1p スタンプ)

私はそれを達成する方法を見つけましたが、tuple() は結果と「なし」を出力していますが、その理由はわかりません。また、正しい結果に到達するためのより良い、より短い方法があるかどうかも知りたいです。

これは私がやったことです:

def stamps(dinero):
    p5=dinero/5
    p5a=p5*5
    resultado1=dinero-p5a
    dinero=resultado1
    p2=dinero/2
    p2a=p2*2
    resultado2=dinero-p2a
    dinero=resultado2
    p1=dinero/1
    p1a=p1*1
    resultado3=dinero-p1a
    dinero=resultado3
    print tuple([p5,p2,p1])

私が得た結果: print stamps(8) is (1, 1, 1) None

更新:より良い解決策を 見つけました。誰かがより良い解決策を知りたい場合に備えて、ここに投稿します。

def stamps(n):
    #Basically, thats the same as return n/5, n%5/2, n%5%2
    return n/5, (n-5*(n/5))/2, (n-5*(n/5))-2*((n-5*(n/5))/2)
4

2 に答える 2

2

人々が述べているように、print を return に変更することができますが、コードの大きな改善点は%(またはモジュロ) 演算子を使用することです。

def stamps(dinero):
    p5=dinero/5
    dinero=dinero%5
    p2=dinero/2
    dinero=dinero%2
    p1=dinero/1
    return tuple([p5,p2,p1])

print stamps(8)
>>> (1,1,1)

あなたのコードでこの行:

p5=dinero/5

整数除算を実行しますが、以下は、元の数の除数の倍数を掛けて減算することで剰余を取得します。

p5a=p5*5
resultado1=dinero-p5a
dinero=resultado1

ほとんどの言語は、これを 1 つのステップで実行するモジュロ関数を提供します。

dinero=dinero%5

これは 3 で割る部分も同じで、1 で割ると整数余りがなくなるので、そのコードを完全に削除できます。

divmod()Python には、除数とモジュラスの両方を返す 方法を使用して、これを再度短縮する方法もあります。

def stamps(dinero):
    p5,dinero=divmod(dinero,5)
    p2,dinero=divmod(dinero,2)
    p1=dinero
    return tuple([p5,p2,p1])

print stamps(8)
>>> (1,1,1)

そして最後に、別の関数に金額とスタンプ値の配列の両方を取り、それを呼び出すことで、それを完全にジェネライズできます。

def stamps(dinero):
    return allStamps(dinero,[5,2,1])

def allStamps(dinero=1,stamps=[]):
    vals = []
    for stamp in sorted(list(set(stamps)), reverse=True):
        val,dinero=divmod(dinero,stamp)
        vals.append(val)
    return tuple(vals)

print stamps(8)
>>> (1,1,1)
print allStamps(8,[5,3,1])
>>> (1,1,0)

コード実行速度について:

私はいくつかのオプションでtimeit実行しました。/%divmod()

> python -m timeit 'a=1000;b=a/5;c=b*5;d=a-c;a=d'
 10000000 loops, best of 3: 0.156 usec per loop
> python -m timeit 'a=1000;b=a/5;a=a-b*5;'
 10000000 loops, best of 3: 0.127 usec per loop
> python -m timeit 'a=1000;a=a-(a/5)*5;'
 10000000 loops, best of 3: 0.121 usec per loop
> python -m timeit 'a=1000/13;b=1000%13;'
 10000000 loops, best of 3: 0.0755 usec per loop
root@meteordev:~# python -m timeit 'a,b=divmod(1000,13);'
 10000000 loops, best of 3: 0.183 usec per loop
于 2013-07-22T01:42:19.100 に答える