python写的大整数相乘的方法

输入

72106547548473106236 982161082972751393 两个大整数

输出结果

70820244829634538040848656466105986748

解题思路

首先根据 大整数相乘的原理的基础上,把大整数进行优化拆分,拆分的长度,要考虑语言中整形的长度。这里用的python,其实可以直接乘的,呵呵。
我暂定设为了 4,也就是 说

7210 6547 5484 7310 6236

98 2161 0829 7275 1393

然后 逐份相乘,当然千万别忘了结果要补零。 例如 当 7310 * 7275 结果一定要补上8个零。

最后 将每一步的结果直接相加就可以了。
里面写了一个函数 xiangjia,就是用于大整数相加的。没做优化,其实也是可以每隔几位 ,分割开的。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# hh=input()
hh='72106547548473106236 982161082972751393'
zonglen=len(hh)-1
a=hh.split()
 
tiqu=4  #提取位数,大小取决于内存中 int型位数,我这里随便写的。因为python,其实没有限制。
<br>#大整数相加的函数,没做优化 没做分割
def xiangjia(a1,b1):
    lista=list(a1[::-1])   #翻转
    listb=list(b1[::-1])
     
    list_resu=[]
    yu9=0
    resu9=0
    for x in range(max(len(a1),len(b1))):  #取最长的数,循环
         
        if x<len(a1):
            ax_temp=int(lista[x])
        else:
            ax_temp=0   #千万别超出索引范围
             
        if x<len(b1):
            bx_temp=int(listb[x])
        else:
            bx_temp=0    
         
        resu9=(ax_temp+bx_temp+yu9)%10    #进位
        yu9=(ax_temp+bx_temp+yu9)//10     #余数
        list_resu.append(resu9)
 
         
    if yu9>0:
        list_resu.append(yu9)  #循环完了后,如果还有余数,继续添加
     
    #转化成正常序列
    resu8=''
    for x in list_resu[::-1]:
        resu8+=str(x)
     
    return resu8
 
 
#创建空list_sum
result0=''
 
#开始遍历
 
#取长度
a0_len=len(a[0])
a1_len=len(a[1])
 
#取除结果
chu0=a0_len//tiqu  
chu1=a1_len//tiqu
 
#取余
yu0=a0_len%tiqu
yu1=a1_len%tiqu
 
x=0
y=0
while chu1-y>=0:
    x=0
    while chu0-x>=0:
         
        if chu0-x>0:           
            cheng0=int(a[0][-(1+x*tiqu):-(tiqu+1+x*tiqu):-1][::-1])
        else:
            if yu0>0:
                cheng0=int(a[0][0:yu0])
            else:
                break           
         
        if chu1-y>0:           
            cheng1=int(a[1][-(1+y*tiqu):-(tiqu+1+y*tiqu):-1][::-1])
        else:          
            if yu1>0:
                cheng1=int(a[1][0:yu1])
            else:
                break          
 
        temp_resu=str(cheng0*cheng1)+'0'*x*tiqu+'0'*y*tiqu      
        result0=xiangjia(result0,temp_resu)
        
        x+=1       
    y+=1  
 
print(result0)

这是优化前的一版,完全按照手工计算的竖式方式编的,仅供参考。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
hh=input()
zonglen=len(hh)-1
a=hh.split()
 
#创建空list_sum
list_sum=[]
for x in range(zonglen-1):
    list_sum.append(0)
 
 
p=0  #空位
for x in a[1][::-1]:  #遍历第二个大数   翻转遍历
    list0=[]
    for y in a[0][::-1]: #遍历第一个大数    翻转遍历
        list0.insert(0,int(x)*int(y))
     
    #移位相加
    n=len(list0)
    for g in range(n):
        list_sum[zonglen-1-g-1-p]+=list0[n-g-1]
         
    p+=1
     
#求和
m=0  #进位数
n=len(list_sum)
 
for z in range(n):   #进位
    list_sum[n-z-1]+=m
    m=0
    if list_sum[n-z-1]>=10:
        m=list_sum[n-z-1]//10       
        list_sum[n-z-1]=list_sum[n-z-1]%10
 
if m>0:    #高位补数 进位
    list_sum.insert(0,m)
 
#转字符串输出
result=''
for x in list_sum:
    result+=str(x)   
     
print(result)
posted @ 2022-10-07 20:35  I'm_江河湖海  阅读(21)  评论(0)    收藏  举报