高精度算法课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《高精度算法课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高精度 算法 课件
- 资源描述:
-
1、High-precision Algorithm基本整数类型的取值范围类型数值范围 占字节数 unsigned char 0.255 1 char -128.127 1 int(long)-2147483648.2147483647 109 4 unsigned int(long)0.4294967295 4 long long -9223372036854775808.9223372036854775807 1018 8 unsigned 0.18446744073709551615 8Long long 使用时有限制,例如,不能作为数组的下标等。为什么需要高精度运算 当要处理的数据超过了任
2、何一种数据类型所能容纳的范围,这种数称为高精度数,必须自定义类型来存储.同时还要自行编写高精度数的运算函数(加减乘除等)高精度数的输入和存储在运算对象的数值范围为任何数据类型所无法容纳的情况下,采用数组(每一个元素对应一位十进制数,由其下标顺序指明位序号)来表示一个数,就称为高精度数。1、采用字符串形式输入,并将其转化为整数数组。2、用一个整型变量记录数据的实际长度(即数组的元素个数)字符串到整数数组的转换 字符串存储时,数的高位被存放在字符串的低位。7632180 1 2 3 4 5 6 7转换成整数数组时,要把高精度数的低位“还原”到数组的低位。这样才便于后续计算。a1存放最低位,a6存放
3、最高位。高精度数的位数可存放在a0中。也可以另用一个变量存放。字符串s68123670 1 2 3 4 5 6 7整型aconst int MAXLEN=241;/最大长度为240位typedef int hpMAXLEN;/定义hp为高精度类型void Str2hp(string s,hp&a)/s转换后存入aint i,len;memset(a,0,sizeof(a);/clear alen=s.size();a0=len;/save the lengthfor(i=0;i=1;i-)cout ai;cout endl;高精度加法问题描述:输入a,b(10240)两个数,输出a+b的值。样
4、例输入:9999999999999999999912345678901234567890样例输出:112345678901234567889算法分析 算法思想类似于竖式加法运算,注意进位处理。把计算结果存到c中:(1)先计算:直接将ai和bi相加,结果放在ci中。.a3 a2 a1 .b3 b2 b1 +c3 c2 c1思考:要进行多少位加法呢?应该取a或b中较长的位数。对10进制而言,ci中的数可能的取值范围是什么?合要求的取值范围是什么?需要作什么处理?算法分析(2)处理进位从最低位开始,逐位整理:把本位模10,向高一位进位:ci+1+=ci/10;ci =ci%10;思考:最多要处理多少
5、位呢?因为两数相加最多向前进一位,所以我们把长度加1。len+;for(i=1;ilen;i+)/注意是ilen,写成i1)&(clen=0)len-;注意,len1的条件是必要的,因为如果和是0的话,想一想该如何保存。void add(hp a,hp b,hp&c)/Add a,b to c hp d;int i,len;memset(d,0,sizeof(d);/d清0 if(a0 b0)len=a0;/求和的位数 else len=b0;for(i=1;i=len;i+)/逐位相加 di=ai+bi;len+;/位数加1 for(i=1;i 1)&(dlen=0)/处理最高位 len-;
6、d0=len;memcpy(c,d,sizeof(d);/保存结果思考:能不能不用d,直接让c参与加法运算呢?提示:结果要保存在a或b中,即Add(a,b,a),不用d行吗?高精度减法运算问题表述:问题表述:输入输入a,b(10240)两个数,输出)两个数,输出a-b的值。的值。样例样例2 2输入:输入:99999910001000样例样例2 2输出:输出:-1-1样例样例1 1输入:输入:456456409409样例样例1 1输出:输出:4747算法分析1、比较a和b的大小,从而确定结果的正负号2、依照由低位至高位的顺序进行减法运算。在每一次位运算中,若出现不够减的情况(aibi),则向高位
7、借位。在进行了减运算后,若高位为0,则要减少结果的长度。在具体计算过程中,仍然用三位走的办法。void sub(hp a,hp b,hp&c)/a must be greater than bint i,len;hp d;memset(d,0,sizeof(d);/clear dlen=a0;for(i=1;i=len;i+)di=ai-bi;for(i=1;i=len;i+)if(di 1)&(dlen=0)/整理差的长度len-;d0=len;memcpy(c,d,sizeof(d);写程序的小经验写程序的小经验1、数组的清零:、数组的清零:保存结果的数组使用前一般都要清零:保存结果的数组
8、使用前一般都要清零:For(i=0;ib,返回1;a b0)return 1;if(a0=1;i-)if(ai bi)return 1;else if(ai bi)return-1;return 0;求Fibonacci数列的第n项Fibonacci数列的代表问题是由意大利著名数学家Fibonacci于1202年提出的“兔子繁殖问题”(又称“Fibonacci问题”)。问题的提出:有雌雄一对兔子,假定过两个月后便每个月可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子?已知:N=1000F(i):第第i个月后共有的兔子对数。个月后共有的兔子对数。F(1)=1;F(2)=1;f(3)=2;f
展开阅读全文