ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:21.03KB ,
资源ID:21872879      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21872879.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(2 高精度运算Word文件下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

2 高精度运算Word文件下载.docx

1、end. 加法运算高精度加法运算 首先,确定a和b中的最大位数x,然后依照由低位至高位的顺序进行加法运算。在每一次运算中,a当前位加b当前位的和除以10,其整商即为进位,其余数即为和的当前位。在进行了x位的加法后,若最高位有进位(ax+10),则a的长度为x+1。以下只列出关键程序: numtype=array1.255 of word; a,b,s: la,lb,ls:word;procedure plus(var a:var la:b:lb:word); 利用过程实现 var i,x: begin if la=lb then x:=la else x:=lb;=1 to x do ai:=

2、ai+bi; ai+1:=ai+1+ai div 10;=ai mod 10; end;while ax+1b) 依照由低位至高位的顺序进行减法运算。在每一次位运算中,若出现不够减的情况,则向高位借位。在进行了la位的减法后,若最高位为零,则a的长度减1。 numtype=array1.255 of longint; a,b: la,lb:procedure minus(var a: i: if ai1) do dec(la);高精度乘法运算 按照乘法规则,从a的第1位开始逐位与c(c为字节型)相乘。在第i位乘法运算中,a的i位与c的乘积必须加上i-1位的进位,然后规整积的i-1位。 numt

3、ype=array1.1000 of word;procedure multiply(var a:c: a1:=a1*c;=2 to la do=ai*c;=ai+ai-1 div 10; ai-1:=ai-1 mod 10; while ala=10 do inc(la); ala:=ala-1 div 10; ala-1:=ala-1 mod 10;扩大进制数改善高精度运算效率 用整数数组每一个元素表示一个十进制整数的方法存在的缺点是:如果十进制的位数很多,则对应的数组的长度会很长,并增加了高精度计算的时间。 如果用一个元素记录2位数字、3位数字或更多位数字,则数组的长度可以明显缩小,但是

4、还要考虑数的取值范围问题,必须保证程序运行过程中不越界。在权衡了两方面的情况后得出:用一个longint记录4位数字是最佳的方案。那么这个数组就相当于一个10000进制的数,其中每一个元素都是10000进制下的一位数。一、数据类型定义: numtype=array1.10000 of longint; 可以存储40000位十进制数 a,n: la,ln:ansistring; 任意长度的字符串类型 二、整数数组的建立和输出 readln(s);k:for i:=1 to k doj:=(k-i+4) div 4;nj:=nj*10+ord(si)-48;end;ln:=(k+3) div 4;

5、 当得出最后结果n后,必须按照次高位到最低位的顺序,将每一位元素由10000进制数转换成十进制数,即必须保证每个元素对应4位十进制数。例如ni=0015(0=i=ln-2),对应的十进制数不能为15,否则会导致错误结果。可以按照如下方法输出n对应的十进制数:write(nln);=ln-1 downto 1 do write(ni div 1000,(ni div 100) mod 10,(ni div 10) mod 10,ni mod 10);三、基本运算 两个10000进制整数的加法和减法与前面的十进制运算方法类似,只是进制变成了10000进制。 1、整数数组减1(n:=n-1,n为整数

6、数组) 从n1出发寻找第一个非零的元素,由于接受了低位的借位,因此减1,其后缀全为9999。如果最高位为0,则n的长度减1。 j:=1; while (nj=0) do inc(j); 寻找第一个非零的元素 dec(nj); 该位接受低位的借位,因此减1=1 to j-1 do ni:=9999; 其后缀全为9999 if (j=ln) and (nj=0) 如果最高位为0,则n的长度减1 then dec(ln); 2、整数数组除以整数(a:=a div i,a为整数数组,i为整数) 按照从高位到低位的顺序,逐位相除,把余数乘进制后加到下一位继续相除。如果最高位为0,则a的长度减1。 l:=

7、0; for j:=la downto 1 do inc(aj,l*10000);=aj mod i; aj:=aj div i; while ala=0 do dec(la); 3、两个整数数组相乘(a:=a*n,a和n为整数数组) 按照从高位到低位的顺序,将数组a的每一个元素与n相乘。procedure multiply(a,b:la,lb:longint;var s:var ls:longint); i,j:=1 to lb do si+j-1:=si+j-1+ai*bj;=1 to la+lb-1 do si+1:=si+1+si div 10000; si:=si mod 10000

8、; if sla+lb=0 then ls:=la+lb-1 else ls:=la+lb;习题与练习 一、用高精度计算出s=1!+2!+3!+.+100!。 参考答案 二、输入任意两个整数a,b(a,b均在长整型范围内),计算a/b的结果,保留100位有效数字,最后一位要求四舍五入。三、两个高精度数相乘。四、2k进制数(digital.pas)(NIOP2006第四题)【问题描述】设r是个2k 进制数,并满足以下条件: (1)r至少是个2位的2k 进制数。 (2)作为2k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。 (3)将r转换为2进制数q后,则q的总位数不超过w。 在这

9、里,正整数k(1k9)和w(kW30000)是事先给定的。 问:满足上述条件的不同的r共有多少个? 我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q。将S从右起划分为若干个长度为k 的段,每段对应一位2k进制的数,如果S至少可分成2段,则S所对应的二进制数又可以转换为上述的2k 进制数r。 例:设k=3,w=7。则r是个八进制数(23=8)。由于w=7,长度为7的01字符串按3位一段分,可分为3段(即1,3,3,左边第一段只有一个二进制位),则满足条件的八进制数有: 2位数:高位为1:6个(即12,13,14,15,16

10、,17),高位为2:5个,高位为6:1个(即67)。共6+5+1=21个。 3位数:高位只能是1,第2位为2:5个(即123,124,125,126,127),第2位为3:4个,第2位为6:1个(即167)。共5+4+1=15个。 所以,满足要求的r共有36个。【输入文件】 输入文件digital.in只有1行,为两个正整数,用一个空格隔开:k W 【输出文件】 输出文件digital.out为1行,是一个正整数,为所求的计算结果,即满足条件的不同的r的个数(用十进制数表示),要求最高位不得为0,各数字之间不得插入数字以外的其他字符(例如空格、换行符、逗号等)。(提示:作为结果的正整数可能很大

11、,但不会超过200位) 【输入样例】3 7【输出样例】36 【题目分析】 考虑一个首位为r、位数为n且除最后一位每一位严格小于右边的2k进制数,它的种数等于从2k-(r+1)个自然数中选出n-1个升序排列。 而题目所求答案等于首位为1.2w mod k-1、位数为w/k+1且符合要求的2k进制数种数,加上首位任意、位数不超过w/k不低于2的且符合要求的2k进制数种数。(当w mod k=0时直接考虑后者即可) 因为k,W是指定的,则可以确定2k进制数r的最长位数是w div k +1,设d=w div k,则d位2k进制数组成的2位以上d位以下的升序排列数应该是:这里还要比较d与的2k-1大小,必须保证d=2k-1。 最后考虑首位的情况,显然首位的最大二进制位数是w mod k,则最大值m=2w mod k - 1,则首位不大于m,总位数是d+1位的升序排列数应是:这里也要比较d与的2k-1大小,必须保证d=2k-1-m。 两者相加即所求,因为最终的运算结果可能会很大,所以必须使用高精度运算。【参考程序】【NIOP满分程序】

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1