- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
高精度和递归;本次讲课重点:;引入;这里我们要用到传说中的高精度算法:
原理:
根据小学生加减乘法的运算过程,用数组进
行模拟,来解决大数加减乘的操作。
效率?
时间复杂度:
高精度加法和减法的时间复杂度都是O(n)
高精度乘法的时间复杂度是O(n^2)
;一、高精度加法:;那么就变成这样:
0 1 2 3 4 5 6 i
2 0 3 9 4 6 3 a[i]
+ 9 4 6 8 0 0 0 b[i]
怎样来求sum[i]呢?
由于i==0时表示为这个数的个位数,i==1表示十位数...那么我们就可以用小学生加法从个位开始算,即从i==0开始往后算。
首先将sum[]数组每一位初始化为0
sum[0]=2+9=11,由于11大于了9,所以我们要向高位进位(即往后进位),那么sum[0]=11-10=1,向高位进位,则sum[1]+=1,此时sum[0]=1,sum[1]暂时为1。
;
0 1 2 3 4 5 6 i
2 0 3 9 4 6 3 a[i]
+ 9 4 6 8 0 0 0 b[i]
i==0 sum[0]=1,sum[1]++; 个位数算出来为1
i==1 sum[1]=0+4+sum[1]=5;不需进位,sum[2]仍为0, 算出十位为5
i==2 sum[2]=3+6+sum[2]=9;不需进位,sum[3]仍为0,
算出百位为9
i==3 sum[3]=9+8+sum[3]=17,需要进位,那么千位应
该为17-10=7,向高位进位,sum[4]++
i==4 sum[4]=4+0+sum[4]=5,不需进位
sum[5]=6,sum[6]=3;
0 1 2 3 4 5 6 i
2 0 3 9 4 6 3 a[i]
+ 9 4 6 8 0 0 0 b[i]
那么,这样算完结束后
sum[]={1,5,9,7,5,6,3};
是不是这两个数的和为1597563呢???
当然不是,因为我们第一位数表示的是个位,所以我们是倒着存的,所以结果因为倒着输出,因此我们计算出了A+B=3657951;高精度加法代码实现(未处理前导零):;二、高精度减法:;那么就变成这样:
0 1 2 3 4 5 6 i
2 0 3 9 4 6 3 a[i]
- 9 4 6 8 2 5 3 b[i]
首先将sub[]数组每一位初始化为0
sub[0]=2-9=-7,由于-7小于0,所以我们要向高位借位(即往后借位),那么sub[0]=-7+10=3,向高位借位,则sub[1]-=1,此时sub[0]=3,sub[1]暂时为-1。; 0 1 2 3 4 5 6 i
2 0 3 9 4 6 3 a[i]
- 9 4 6 8 2 5 3 b[i]
i==0 sub[0]=3,sub[1]=-1; 个位数算出来为3
i==1 sub[1]=0-4+sub[1]=-5;需要借位,sub[1]=-5+10=5,sub[2]=-1,算出十位为5
i==2 sub[2]=3-6+sub[2]=-4;需要借位,sub[2]=-4+10=6,sub[3]=-1,此时百位为6
i==3 sub[3]=9-8+sub[3]=0 不需借位,那千位为0
i==4 sub[4]=4-2+sub[4]=2 不需借位,sub[5]仍为0
i==5 sub[5]=6-5+sub[5]=1 不需借位,sub[6]仍为0
i==6 sub[6]=3-3+sub[6]=0;
计算结束
; 0 1 2 3 4 5 6 i
2 0 3 9 4 6 3 a[i]
- 9 4 6 8 2 5 3 b[i]
此时的sub[]={3,5,6,0,2,1,0}
如果倒着输出,那么答案会变成:0120653
有前导零!!!!
去掉就行了,怎么去掉?
我们用len表示sub数组数的个数,此样例len=7
for(int i=len-1;i
原创力文档


文档评论(0)