熱線電話:13121318867

登錄
首頁精彩閱讀python里大整數相乘相關技巧指南
python里大整數相乘相關技巧指南
2017-08-14
收藏

python里大整數相乘相關技巧指南

對于大整數計算,一般都要用某種方法轉化,否則會溢出。但是python無此擔憂了。Python支持“無限精度”的整數,一般情況下不用考慮整數溢出的問題,而且Python Int類型與任意精度的Long整數類可以無縫轉換,超過Int 范圍的情況都將轉換成Long類型。

問題

大整數相乘

思路說明

對于大整數計算,一般都要用某種方法轉化,否則會溢出。但是python無此擔憂了。

Python支持“無限精度”的整數,一般情況下不用考慮整數溢出的問題,而且Python Int類型與任意精度的Long整數類可以無縫轉換,超過Int 范圍的情況都將轉換成Long類型。

例如:


注意:前面的“無限精度”是有引號的。事實上也是有限制的,對于32位的機器,其上限是:2^32-1。真的足夠大了。

為什么Python能夠做到呢?請有興趣刨根問底的去看Python的有關源碼。本文不贅述。

在其它語言中,通常用“分治法”解決大整數相乘問題。

但是,這里提供一個非常有意思的計算兩個整數相乘的方法,算是做為大整數相乘的演示。

兩個整數相乘:阿拉伯乘法。


#!/usr/bin/env python
#coding:utf-8
 
#阿拉伯乘法
defarabic_multiplication(num1,num2):
  num_lst1=[int(i)foriinstr(num1)]#將int類型的123,轉化為list類型的[1,2,3],每個元素都是int類型
  num_lst2=[int(i)foriinstr(num2)]
 
  #兩個list中整數兩兩相乘
  int_martix=[[i*jforiinnum_lst1]forjinnum_lst2]
 
  #將上述元素為數字的list轉化為元素類型是str,主要是將9-->'09'
  str_martix=[map(convert_to_str,int_martix[i])foriinrange(len(int_martix))]
 
  #將上述各個list中的兩位數字分開:['01','29','03']-->[0,2,0],[1,9,3]
  martix=[[int(str_martix[i][j][z])forjinrange(len(str_martix[i]))]foriinrange(len(str_martix))forzinrange(2)]
 
  #計算阿拉伯乘法表的左側開始各項和
  sum_left=summ_left(martix)
 
  #計算阿拉伯乘法表的底部開始各項和
  sum_end=summ_end(martix)
 
  #將上述兩個結果合并后翻轉
  sum_left.extend(sum_end)
  sum_left.reverse()
 
  #取得各個和的個位的數字(如果進位則加上)
  result=take_digit(sum_left)
 
  #翻轉結果并合并為一個結果字符串數值
  result.reverse()
  int_result="".join(result)
  print"%d*%d="%(num1,num2)
  printint_result
 
#將int類型轉化為str類型,9-->'09'
 
defconvert_to_str(num):
  ifnum<10:
    return"0"+str(num)
  else:
    returnstr(num)
 
#計算阿拉伯乘法表格左側開始的各項之和
 
defsumm_left(lst):
  summ=[]
  x=[iforiinrange(len(lst))]
  y=[jforjinrange(len(lst[0]))]
  sx=[iforiinxifi%2==0]
  foriinsx:
    s=0
    j=0
    whilei>=0andj<=y[-1]:
      s=s+lst[i][j]
      ifi%2==1:
        j=j+1
      else:
        j=j
      i=i-1
    summ.append(s)
  returnsumm
 
#計算阿拉伯乘法表格底部開始的各項之和
 
defsumm_end(lst):
  summ=[]
  y=[jforjinrange(len(lst[0]))]
  ex=len(lst)-1
  forminrange(len(y)):
    s=0
    i=ex
    j=m
    whilei>=0andj<=y[-1]:
      s=s+lst[i][j]
      ifi%2==1:
        j=j+1
      else:
        j=j
      i=i-1
    summ.append(s)
 
  returnsumm
 
#得到各個元素的個位數,如果是大于10則向下一個進位
 
deftake_digit(lst):
  tmp=0
  digit_list=[]
  forminrange(len(lst)):
    lstm=0
    lstm=lst[m]+tmp
    iflstm<10:
      tmp=0
      digit_list.append(str(lstm))
    else:
      tmp=lstm/10
      mm=lstm-tmp*10
      digit_list.append(str(mm))
  returndigit_list
 
if__name__=="__main__":
  arabic_multiplication(469,37)



數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢