python寫的大整數相乘的方法


輸入   

72106547548473106236 982161082972751393  兩個大整數

輸出結果

70820244829634538040848656466105986748

 

解題思路

 

首先根據 大整數相乘的原理的基礎上,把大整數進行優化拆分,拆分的長度,要考慮語言中整形的長度。這里用的python,其實可以直接乘的,呵呵。
我暫定設為了 4,也就是 說
7210 6547 5484 7310 6236

98 2161 0829 7275 1393
然后 逐份相乘,當然千萬別忘了結果要補零。 例如  當 7310 * 7275 結果一定要補上8個零。

最后 將每一步的結果直接相加就可以了。
里面寫了一個函數 xiangjia,就是用於大整數相加的。沒做優化,其實也是可以每隔幾位 ,分割開的。
 
        
# hh=input()
hh='72106547548473106236 982161082972751393'
zonglen=len(hh)-1
a=hh.split()

tiqu=4  #提取位數,大小取決於內存中 int型位數,我這里隨便寫的。因為python,其實沒有限制。

#大整數相加的函數,沒做優化 沒做分割 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)

 

 

這是優化前的一版,完全按照手工計算的豎式方式編的,僅供參考。

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)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM