twobignumbersum.py-20180414

本文介绍了一种处理超出常规整数范围的大数相加的方法。通过将大数表示为字符串,并采用逐位相加的方式实现两个大数的加法运算。文章详细解释了算法步骤,包括字符串对齐、倒序相加及进位处理。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 14 09:22:54 2018

@author: vicky
"""

#两个大数相加

#大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求。可以使用字符串来表示大数,模拟大数相加的过程。
#思路:
#1.对齐两个字符串,即短字符串的高位用‘0’补齐,便于后面的相加;
#2.反转两个字符串,便于从低位到高位相加和最高位的进位导致和的位数增加;
#3.把两个正整数相加,一位一位的加并加上进位。


#def bigsum1(L1,L2):
#    max_len = max(len(L1), len(L2)) #最大长度
#    #str.zfill(width):返回指定长度的字符串,原字符串右对齐,前面填充0
#    l1 = L1.zfill(max_len) #短字符串的高位用‘0’补齐
#    l2 = L2.zfill(max_len)
#    
#    a1 = list(l1)
#    a2 = list(l2)
#    a3 = [0] * (max_len + 1)
#    
#    for index in range(max_len - 1, -1, -1): #倒序相加
#        index_sum = a3[index + 1] + int(a1[index]) + int(a2[index])
#        less = index_sum - 10
#        a3[index + 1] = index_sum % 10
#        a3[index] = 1 if less >= 0 else 0
#    
#    if(a3[0] == 0):  #去掉首位的0
#        a3.pop(0)
#    
#    a33 = [str(i) for i in a3] 
#    #print(''.join(a33))
#    ans=''.join(a33) 
#    return ans
#
#
##L1 = "2649821731631836529481632803462831616487712734074314936141303241873417434716340124362304724324324324324323412121323164329751831"
##L2 = "1232141045091731748365195814509145981509438583247509149821493213241431431319999999999999999999999999999999999999999999999999341344779"
#L1='123'
#L2='100'
#print(bigsum1(L1,L1))

def bigsum2(s1,s2): 
    L1=[]   #把输入的string中的每个数字int转换到list中存放 
    L2=[]  
    for i in range(0,len(s1)): 
        L1.append(int(s1[i]))  
    for i in range(0,len(s2)):  
        L2.append(int(s2[i]))  

    if(len(s1)>len(s2)):  #短字符串的末尾用‘0’补齐,使得L1,L2的长度相同
     for i in range(len(s1)-len(s2)):  
        L2.append(0)  
    elif(len(s1)<=len(s2)):  
        for i in range(len(s2)-len(s1)):  
            L1.append(0)   

    for i in range(len(L1)):  #对应位置相加
            L1[i]=L1[i]+L2[i]  
    A=B=len(L1)-1  
    while A>0:   #十进制过程,倒序从后向前找大于和10的进一
        if((L1[A])/10)>=1:  # or if((L1[A]//10)>0)   #//返回商的整数部分
            L1[A]=L1[A]%10  #取余数
            L1[A-1]=L1[A-1]+1  #进1
        A-=1

    if(L1[0] == 0):  #去掉首位的0
        L1.pop(0)
    
    ans=str()
    for i in range(B+1):
        ans=ans+str(L1[i])
    #print(ans)
    return ans

#s1='123'
#s2='100'
s1 = "2649821731631836529481632803462831616487712734074314936141303241873417434716340124362304724324324324324323412121323164329751831"
s2 = "1232141045091731748365195814509145981509438583247509149821493213241431431319999999999999999999999999999999999999999999999999341344779"
print(bigsum2(s1,s1))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值