高精度(学习教程和方法).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
高精度(学习教程和方法)

高精度加法 var s1,s2:string;   a,b,c:array [1..260] of integer;   i,l,k1,k2:integer;   begin   write(input s1:);readln(s1);   write(input s2:);readln(s2);   {————读入两个数s1,s2,都是字符串类型}   l:=length(s1);{求出s1的长度,也即s1的位数;有关字符串的知识。}   k1:=260;   for i:=l downto 1 do   begin   a[k1]:=ord(s1)-48;{将字符转成数值}   k1:=k1-1;   end;   k1:=k1+1;   {————以上将s1中的字符一位一位地转成数值并存在数组a中;低位在后(从第260位开始),高位在前(每存完一位,k1减1),完后,k1指向最高位}   对s2的转化过程和上面一模一样。   二、运算过程   在往下看之前,大家先列竖式计算35+86。   注意的问题:   (1)运算顺序:两个数靠右对齐;从低位向高位运算;先计算低位再计算高位;   (2)运算规则:同一位的两个数相加再加上从低位来的进位,成为该位的和;这个和去掉向高位的进位就成为该位的值;如上例:3+8+1=12,向前一位进1,本位的值是2;可借助MOD、DIV运算完成这一步;   (3)最后一位的进位:如果完成两个数的相加后,进位位值不为0,则应添加一位;   (4)如果两个加数位数不一样多,则按位数多的一个进行计算;   if k1k2 then k:=k1 else k:=k2;   y:=0;   for i:=260 downto k do   begin   x:=a+b+y;   c:=x mod 10;   y:=x div 10;   end;   if y0 then begin k:=k-1;c[k]:=y; end;   三、结果的输出(这也是优化的一个重点)   按运算结果的实际位数输出   for i:=k to 260 do write(c);   writeln;   例子:求两个数的加法 program sum; var s,s1,s2:string; a,b,c:array [1..260] of integer; x,y,i,l,k1,k2,k:integer; begin write(input s1:);readln(s1); write(input s2:);readln(s2); l:=length(s1); k1:=260; for i:=l downto 1 do begin a[k1]:=ord(s1[i])-48; k1:=k1-1; end; k1:=k1+1; l:=length(s2); k2:=260; for i:=l downto 1 do begin b[k2]:=ord(s2[i])-48; k2:=k2-1; end; k2:=k2+1; if k1k2 then k:=k2 else k:=k1; y:=0; for i:=260 downto k do begin x:=a[i]+b[i]+y; c[i]:=x mod 10; y:=x div 10; end; if y0 then begin k:=k-1; c[k]:=y; end; for i:=k to 260 do write(c[i]); writeln; end.   四、优化:   以上的方法的有明显的缺点:   (1)浪费空间:一个整型变量(-32768~32767)只存放一位(0~9);   (2)浪费时间:一次加减只处理一位;   针对以上问题,我们做如下优化:一个数组元素存放四位数;(integer的最大范围是32767,5位的话可能导致出界)将标准数组改为紧缩数组。第一步的具体方法:   l:=length(s1);   k1:=260;   repeat {————有关字符串的知识}   s:=copy(s1,l-3,4);   val(s,a[k1],code);   k1:=k1-1;   s1:=copy(s1,1,l-4);   l:=l-4;   until l=0;   k1:=k1+1;   而因为这个改进,算法要相应改变:   (1)运算时:不再逢十进位,而是逢万进位(mod 10000; div 10000);   (2)输出时:最高位直接输出,其余各位,要判断是否足够4位,不足部分要补0;例如:1,23,2345这样三段的数,输出时,应该是100232345而不是1232345。   改进后的算法:   program sum;  

文档评论(0)

asd522513656 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档