大數加,減,乘,除
阿新 • • 發佈:2018-12-31
大數相加
模擬我們豎式的計算方法,從第位加起,超過10,則低位減10,計算高位時加1.
123456789 + 987654321 = ?
大數乘法(其中包括大數加法的演算法)
同樣模擬我們豎式的計算方法
eg:835*49
實現程式碼:
方案一:
# -*- coding=utf-8 -*- def big_number_multiply(str1, str2): result = [0] * (len(str1) + len(str2)) n1 = len(str1) n2 = len(str2) n3 = len(result) loop = 0 while n2 > 0: while n1 > 0: result[n3-1]=result[n3-1] + int(str2[n2-1]) * int(str1[n1-1]) n1 = n1-1 n3 = n3-1 n1 = len(str1) n2 = n2-1 loop = loop+1 n3 = len(result)-loop n = len(result) while n > 0: result[n - 2] = result[n - 2] + result[n - 1] // 10 result[n - 1] = result[n - 1] % 10 n = n - 1 rr = "".join(str(i) for i in result) rr = rr.lstrip('0') return rr str1 = '1234567890987654321234567890987654321' str2 = '1234567890987654321111234567890987654322222222212345678909876543123456789009876543123456789' print(big_number_multiply(str1, str2)) print(int(str1)*int(str2))
方案二:
# -*- coding=utf-8 -*- import sys def big_number_multiply(str1, str2): result = [0] * (len(str1) + len(str2)) t1 = str1[::-1] t2 = str2[::-1] for i in range(len(t2)): for j in range(len(t1)): result[j + i] += int(t2[i]) * int(t1[j]) for k in range(len(result)): if result[k] >= 10: result[k+1] += result[k] / 10 result[k] = result[k] % 10 while result != [] and result[-1] == 0: result = result[:-1] if result == []: return 0 return "".join([str(int(i)) for i in result[::-1]])
大數相乘參考部落格:https://blog.csdn.net/ruger008/article/details/53114804/
注:在python中沒有溢位限制,故用print(int(str1)*int(str2))也能得到大數相乘的結果
大數減法
相減演算法也是從低位開始減的。先要判斷被減數和減數哪一個位數長,若被減數位數長是正常的減法;若減數位數長,則用被減數減去減數,最後還要加上負號;當兩數位數長度相等時,最好比較哪一個數字大,否則負號處理會很繁瑣;處理每一項時要,如果前一位相減有借位,就先減去上一位的借位,無則不減,再去判斷是否能夠減開被減數,如果減不開,就要借位後再去減,同時置借位為1,否則置借位為0。
大數除法
大數除法是四則運算裡面最難的一種。不同於一般的模擬,除法操作不是模仿手工除法,而是利用減法操作來實現的。其基本思想是反覆做除法,看從被除數裡面最多能減去多少個除數,商就是多少。逐個減顯然太慢,要判斷一次最多能減少多少個整數(除數)的10的n次方。
以7546除以23為例:
先用7546減去23的100倍,即減去2300,可以減3次,餘下646,此時商就是300 (300=100*3);然後646減去23的10倍,即減去230,可以減2次,餘下186,此時商就是320 (320=300+10*2);
然後186減去23,可以減8次,餘下2,此時商就是328 (328=320+1*8);
因為2除以23的結果小於1,而我們又不用計算小數點位,所以不必再繼續算下去了。