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