我需要用给定的数字来计算,有多少“五”,“两个”和“一个”可以进入这些数字。对不起,我的英语有点受限于这种解释:) 也许一个例子更好:
锻炼; Tibial: 印章(8) 结果应该是:(1,1,1)(一个5p邮票,一个2p邮票和一个1p邮票)
我找到了实现这一目标的方法,但是元组()打印结果和“无”,我不知道为什么。 我也想知道是否有更好,更短的方法来获得正确的结果。
这就是我所做的:
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])
我得到的结果:打印戳(8)是 (1,1,1) 无
更新: I´ve found a better solution,我在这里发帖,以防万一有人想要更好的解决方案:
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)
答案 0 :(得分:2)
正如人们所说,您可以将打印更改为返回,但是代码的重大改进是使用%
(或模数)运算符。
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
大多数语言都提供modulo function,只需一步即可执行此操作:
dinero=dinero%5
对于除以3的部分,这是相同的,当除以1时,永远不会有整数除法器,因此您可以完全删除该代码。
Python还有一种方法可以使用divmod()
再次缩短它,它会返回除数和模数:
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
答案 1 :(得分:0)
将“打印”更改为“返回”功能,当您调用“print stamps(8)”时应该将其修复。另外,不,为了简单选择标记值5,2,1,没有比你正在做的更好的方法来找到一个好的解决方案(唯一可能的改进可能是使用for循环,如果你有更多的标记值而不仅仅是3) - 如果您的标记值更复杂,那么您可以找到使用动态编程使用更少标记的更好解决方案。