数字中的最大交替和

2 投票
2 回答
817 浏览
提问于 2025-04-17 23:24

交替和的定义是这样的:

alternating sum

我需要写一个函数,找出特定长度的最大交替和:比如数字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])。想一想,这样更合理。处理符号变化的时候,确实很容易迷失方向。

撰写回答