资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,高精度计算,C/C+,中的,int,类型能表示的范围一般是,-2,31,2,31,1,。,unsigned,类型能表示的范围是,0,2,32,1,,即,0,4294967295,。所以,,int,和,unsigned,类型变量,都不能保存超过,10,位的整数。,我们如何进行大整数的运算?比如如何计算两个,100,位整数的和?,如果有一个长度为,100,位的大整数,我们如何存储?,1,大整数加法,问题描述,求两个不超过,100,位的非负整数的和。,输入数据,有两行,每行是一个不超过,100,位的非负整数,没有多余的前导,0,。,输出要求,一行,即相加后的结果。结果里不能有多余的前导,0,,即如果结果是,342,,那么就不能输出为,0342,。,输入样例,22222222222222222222,33333333333333333333,输出样例,Output Sample:,55555555555555555555,几个需要考虑的问题:,1,、如何存储大整数?,数组,2,、如何实现加法?,逐位相加,3,、如何处理进位?,向数组的高位进位,3,1,0,2,2,6,3,8,6,6,7,6,7,8,3,6,9,0,5,4,+,10,7,7,10,5,12,12,8,11,10,0,8,7,0,6,2,3,9,1,1,1,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,参考程序:,#include,#include,using namespace std;,string s1,s2;,int a100,b100,c100,jw;,int main(),cins1;,cins2;,/,把,s1,的长度,放入到,a0;,a0=s1.size();,/,把个位放入,a1,,把十位放入,a2,把百位放入,a3,for(int i=a0-1;i=0;i-),int j=a0-i;,aj=s1i-0;,/,把,s2,的长度,放入到,b0;,b0=s2.size();,/,把个位放入,b1,,把十位放入,b2,把百位放入,b3,for(int i=b0-1;i=0;i-),int j=b0-i;,bj=s2i-0;,/,在,c0,放入,,a0,和,b0,的最大值,和的最少位数,if(a0b0),c0=a0;,else,c0=b0;,/,按位加法,for(int i=1;i0),c0+;,cc0=jw;,/,输出答案,for(int i=c0;i=1;i-),couts1;cins2;,/,预处理,if(s2.size()s1.size()flag=true;,if(s2.size()=s1.size(),if(flag=true),cout=0;i-),int j=a0-I;,aj=s1i-0;,b0=s2.size();,for(int i=b0-1;i=0;i-),int j=b0-I;,bj=s2i-0;,/,按位减法,c0=a0;,for(int i=1;i=c0;i+),if(ai-bi=1;i-),if(ci0)break;,elsec0-;,if(c0=0)c0=1;/,答案为,0,/,输出答案,for(int i=c0;i=1;i-),couts1;,cinb;,a0=s1.size();,/,把个位放入,a1,,把十位放入,a2,把百位放入,a3,for(int i=a0-1;i=0;i-),int j=a0-i;,aj=s1i-0;,/,被除数位数为最终位数,c0=a0;,/,按位计算,for(int i=1;i=c0;i+),ci=ai*b;,/,处理进位,,最高位不处理,for(int i=1;i=10),ci+1+=ci/10;,ci=ci%10;,/,输出,for(int i=c0;i=1;i-),couts1s2;,/a0,里存入长度,每一位倒序存入,ai,a0=s1.size();,for(int i=a0-1;i=0;i-),int j=a0-i;,aj=s1i-0;,b0=s2.size();,for(int i=b0-1;i=0;i-),int j=b0-i;,bj=s2i-0;,/b逐位乘数组a,for(int i=1;i=b0;i+),for(int j=1;j1&cc0=0),c0-;/更新c的位数,for(int i=c0;i0;i-),coutci;,return 0;,
展开阅读全文