数字中的最大交替和
交替和的定义是这样的:

我需要写一个函数,找出特定长度的最大交替和:比如数字43805的交替和长度为3:
4-3+8,
3-8+0,
8-0+5
这个函数的输出示例:>>> altsum_digits(5**36, 12) 18
我写了代码,但不知道为什么结果不对,对于数字5**36,我得到的答案是20,而不是18。你能告诉我该怎么修正我的代码吗?
还有一个问题:我们定义nplus、nminus、nmult分别为每次运行函数时加法、减法和乘法的次数。我需要根据输入的n和d为每个参数写一个数学表达式,但我还是个初学者,对此毫无头绪,任何帮助都非常感谢。
这是我的代码:
def altsum_digits(n,d):
c = [int(l) for l in str(n)]
maxaltsum=0
tmpmax=0
for i in range(0,d):
tmpmax=tmpmax+((-1)**(i)*c[i])
it=(len(c)-d)
for i in range(1,it):
tmpmax=c[i+d-1]-(tmpmax-c[i-1])
if (tmpmax)>maxaltsum:
maxaltsum=tmpmax
print(maxaltsum)
2 个回答
0
在elias的回答和评论中提到的三个错误(maxaltsum
的初始化错误、第二个循环中的迭代次数错误,以及第二个循环中tmpmax计算时缺少一个-
)中,至少第一个错误可以通过使用Python自带的功能来避免。
每当你遇到一个问题,要求“找出最大的某个东西”,而你解决这个问题的方法是穷举所有可能的东西来寻找最大值时,你可以使用Python自带的max
函数。下面是如何使用Python生成器来实现这一点:
def altsums(n, d):
c = [int(l) for l in str(n)]
alt = 0
for i in range(0,d):
alt=alt+((-1)**(i)*c[i])
yield alt
it=(len(c)-d)
for i in range(1,it):
alt = -c[i+d-1]-(alt-c[i-1])
yield alt
print(max(altsums(5**36, 12))
0
根据简单的调试,我觉得你计算 tmpmax 的方法有问题,之前的 tmpmax 计算错了,你漏掉了一个负号:应该用 tmpmax=-c[i+d-1]-(tmpmax-c[i-1])
,而不是 tmpmax=c[i+d-1]-(tmpmax-c[i-1])
。想一想,这样更合理。处理符号变化的时候,确实很容易迷失方向。