1
>>> def lcm(a,b):
    if a<<b:
        c=a
        a=b
        b=c
    c=0
    lit=[a,b,c]
    n=3
    while (not lit[n%3]%lit[(n%3)+1]==0):
        lit[(n%3)+2]=lit[n%3]%lit[(n%3)+1]
        if lit[(n%3)+2]==0:
            d=lit[(n%3)+2]
            print d
        else:
            n=n+1

这是代码,试图构建一个函数 lcm 找到 a 和 b 的最小公倍数。不是最干净的代码,但遗憾的是这就是我能做的。如果这个代码块可以更轻一点,那就太好了。

所以,呃,回到正题,我调用了 lcm,它只是脱口而出错误消息。

这就是它所说的:

>>> lcm(78696,19332)

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    lcm(78696,19332)
  File "<pyshell#1>", line 10, in lcm
    lit[(n%3)+2]=lit[n%3]%lit[(n%3)+1]
IndexError: list assignment index out of range

Aaaaand 我完全不知道我现在应该做什么。
我现在能做什么?

4

2 回答 2

0

n%3可以大到 2。所以n%3 + 1可以大到 3。列表lit只有 3 个项目,所以在这一行,

lit[(n%3)+2]=lit[n%3]%lit[(n%3)+1]

如果 n%3 == 2,则访问 lit[(n%3)+1] 将导致索引超出范围错误。

于 2017-02-18T06:10:20.497 回答
0

Python 列表是零索引的。

所以 lit[0] = a、lit[1] = b 和 lit[2] = c。

lit[(n%3)+2]=lit[n%3]%lit[(n%3)+1]

如果 n = 1,则 (n%3)+2 等于 3。如果 n = 2,则 (n%3)+2 等于 4。

如果你想保证你在一个有效的索引处访问你的列表,那么你想按列表的长度来百分比 - 你正在做的,只是不在正确的位置。

在不深入研究您的代码的情况下,我认为操作顺序很重要只是另一个教训。尝试 (n+2)%3 而不是 (n%3)+2。

x%3 将始终在 [0, 2] 范围内-这就是为什么您要在最后进行修改的原因。(x%3+n 最终在 [n, 2+n] 范围内。)

于 2017-02-18T06:11:11.917 回答