大数加,减,乘,除

大数相加

模拟我们竖式的计算方法,从第位加起,超过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,而我们又不用计算小数点位,所以不必再继续算下去了。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值