这个加法算法的Python实现有什么问题?

2024-10-03 00:31:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始关注斯坦福大学的CS161课程“算法和数据结构在线课程”

我查过一些关于整数运算的小学算法。你知道吗

我有伪代码中的加法算法,并对在python2.7中实现它感兴趣(相应地符合MIT标准)。你知道吗

我已经分析了我的实现,认为它几乎是正确的,但是Python解释器提供了一些关于未初始化列表和变量的反馈。你知道吗

注意我并不完全精通Python,由于缺乏基本数据结构和代码结构方面的知识,可能会出现一些明显的语法错误。你知道吗

我对下面的代码有几个问题:

def add(a,b):
    i = 0
    carry = 0
    x[i] = [None]*N
    y[i] = [None]*N
    while x[i] > 0 and y[i] > 0:
        x[i], y[i] = a%10, b%10
        a , b = a/pow(10,i+1), b/pow(10,i+1)
        N += i
    for i in range(N):
        x[i] = x[N-i]
        y[i] = y[N-i]
        r[i] = (x[i] + y[i] + carry)%10
        carry = (x[i] + y[i] + carry)/10
    r[N] = carry
    return r  

算法说明:

add()函数将两个N位整数a和b作为输入,并返回一个整数,其中N位或N+1位对应于ab的和。你知道吗

它首先将ab分解成大小为N的列表,通过将每个数字从最小幂次的数字提取到最大幂次为10的数字来保存和存储a(分别为b)的N个数字。你知道吗

然后用x[N-i]替换所有x[i](分别是。y[i]y[N-i])进行运算,然后通过在每次迭代中处理加法的进位来计算x[i]+y[i]。你知道吗

进位按值动态递增。 当for循环结束时,我们将总和的最新数字r[N]指定为进位值(>;=0)。你知道吗

问题:

  1. 初始化列表x[i]y[i]是件好事吗?方法是将其元素的值赋为[None]N次?你知道吗
  2. x[i]y[i]这样初始化时,while循环是否应该再次工作,因为我的条件在x[i]y[i]上?你知道吗
  3. 如何返回整个列表,即listr[N]?我们应该键入returnr[N]还是只返回r?你知道吗

欢迎其他有益的贡献和评论。你知道吗


Tags: 代码算法noneadd数据结构列表for数字
1条回答
网友
1楼 · 发布于 2024-10-03 00:31:37
  1. 是的,那很好,视上下文而定。您可能会做得更好:x = [None for _ in xrange(N)],但性能非常相似,这不太重要—可读性才是最重要的。你知道吗
  2. 如果0是一个合法的值,我将执行x[i] is None来查看该值是否为none。否则,我只需执行x[i],检查I是否为None、0或False。你知道吗
  3. return r

请看下面的代码。我修复了add(),包括超出界限的索引和算法问题。然后实现了addSimplified(),它不需要额外的helper数组就可以实现同样的功能。你知道吗

def add(a, b):

    N = max(len(str(a)), len(str(b)))
    carry = 0

    x = [None] * N
    y = [None] * N
    r = [None] * (N + 1)

    for i in xrange(N):
        x[i], y[i] = a % 10, b % 10
        a, b = a / 10, b / 10

    for i in xrange(N):
        r[i] = (x[i] + y[i] + carry) % 10
        carry = (x[i] + y[i] + carry) / 10
    r[N] = carry

    return r


def addSimplified(a, b):

    N = max(len(str(a)), len(str(b))) + 1
    carry = 0

    r = [0] * N

    for i in xrange(N):
        step = (a / pow(10, i) % 10)  + (b / pow(10, i) % 10) + carry
        r[i] = step % 10
        carry = step / 10

    return r

print add(100, 20), addSimplified(100, 20)
print add(166, 66), addSimplified(166, 66)
print add(1920606,  9500666), addSimplified(1920606,  9500666)

相关问题 更多 >