我想在python中添加两个非常大的数字,即使bignum也无法处理

时间:2018-12-25 14:16:00

标签: python-3.x python-2.7

我是python的新手,我想在python中添加两个非常大的数字,即使bignum也无法处理。我可以将这两个数字作为一个字符串,然后可以从结尾进行计算,就像我们以前在旧学校加法过程中所做的一样。我们可以把马车加到下一个数字上,依此类推。 请协助。

2 个答案:

答案 0 :(得分:3)

这个问题似乎足以使圣诞节编码小吃变得有趣。

这是我使用Python中许多内置函数的实现。

  • reversed用于迭代从右到左的数字序列,即就像我们在纸上进行计算时一样
  • zip_longest在序列的结尾处以零填充(因为我们会忽略纸上的数字)
  • divmod在单个调用中计算结转值和当前数字。
  • 结果被反转,因此再次反转为最低有效位数倒数,并使用lstrip删除了左边的零零散。

但是,它不处理负数。


from itertools import zip_longest


def add(a, b):
    out = []
    a = [int(c) for c in str(a)]
    b = [int(c) for c in str(b)]
    carry = 0
    for ca, cb in zip_longest(reversed(a), reversed(b), fillvalue=0):
        carry, digit = divmod(ca + cb + carry, 10)
        out.append(str(digit))
    return "".join(reversed(out)).lstrip("0")


a = 9999 ** 29
b = 3725241 ** 9

assert add(a, b) == str(a + b)

答案 1 :(得分:0)

经过3个小时的工作,我实现了这一目标。 :)

def add_func(num1,num2):

    res_list = []

    number1 = str(num1)
    number2 = str(num2)
    length1 = len(str(number1))
    length2 = len(str(number2))


    if(length1 > length2):
        while(length1 > length2):
            number2 = '0' + number2
            length2 += 1

    if(length2 > length1):
        while(length2 > length1):
            number1 = '0' + number1
            length1 += 1

    i = max(length1,length2)

    carry = 0

    while(i > 0):
        if(int(number1[i-1]) + int(number2[i-1]) + carry > 9):
            result = str(int(number1[i-1]) + int(number2[i-1]) + carry)
            res_list.insert(0,(result[-1]))
            carry = 1

            if(i==1):
                result = str(int(number1[i-1]) + int(number2[i-1]) + carry)
                res_list[0]= result


        elif(int(number1[i-1]) + int(number2[i-1]) > 9):
            result = str(int(number1[i-1]) + int(number2[i-1]))
            res_list.insert(0,(result[-1]))
            carry = 1

        else:
            result = str(int(number1[i-1]) + int(number2[i-1]) + carry)
            res_list.insert(0,(result[-1]))
            carry = 0

        i -=1

    final_output = ('').join(res_list)
    return final_output

print(add_func(9999**29,3725241**9))