1. 程式人生 > >大數加,減,乘,除

大數加,減,乘,除

大數相加

模擬我們豎式的計算方法,從第位加起,超過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,而我們又不用計算小數點位,所以不必再繼續算下去了。