03 高精度计算 - 朴秀峰.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
梅森数第一个问题输出有多少位由于的各位数只可能是所以和的位数相同使用标准库中在里声明的求以为底的对数的函数函数就能轻松求得的位数的值需要用一种高效率的办法来算梅森数为了加快计算速度可以用一个数组元素对应于大整数的位即将大整数表示为进制而数组中的每一个元素就存放进制数的位例如用型数组来存放整数那么只需两个数组元素就可以了由于只要求结果的最后位数字所以我们不需要计算完整的结果只需算出最后位即可因为用每个数组元素存放十进制大整数的位所以本题中的数组最多只需要个元素程序略朴秀峰问题求解与程序设计高精度数

梅森数 第一个问题,输出2p-1 有多少位。由于2p-1 的各位数只可能是2, 4, 6, 8 所以2p-1 和2p的位数相同。 使用C/C++标准库中在math.h 里声明的,求以10 为底的对数的函数double log10(double x) 函数,就能轻松求得2p-1 的位数。 2p 的值需要用一种高效率的办法来算。 p = a020 +a121+ a222+…+ an-12n-1 + 2n 梅森数 为了加快计算速度,可以用一个数组元素对应于大整数的4 位,即将大整数表示为10000 进制,而数组中的每一个元素就存放10000 进制数的1 位。 例如,用int 型数组 a 来存放整数6373384,那么只需两个数组元素就可以了,a[0]=3384, a[1]=637。 由于只要求结果的最后500 位数字,所以我们不需要计算完整的结果,只需算出最后500 位即可。因为用每个数组元素存放十进制大整数的4 位,所以本题中的数组最多只需要125 个元素。 程序略。 朴秀峰 xfpiao@126.com 问题求解与程序设计 高精度数据的处理方法 用字符格式表示长数据:char str[200]; 数组下标 0 1 2 3 4 5 6 7 s1内容 4 5 6 7 2 3 3 \0 s2内容 1 4 3 8 5 \0 ? 高精度数据的处理方法 存在的问题 数位没有对齐; 运算方向是倒置的,即目前下标0指向的数位是最高位,从下标为 0的数据开始计算并不会得到正确的结果,更不用说在数位没有对齐的情况。 数组中的内容是 ASCII 码形式。 对数据进行转换是必要的 高精度数据的处理方法——数据转换 输入 数组下标 0 1 2 3 4 5 6 7 s1内容 4 5 6 7 2 3 3 \0 s2内容 1 4 3 8 5 \0 ? 数位 6 5 4 3 2 1 0 a内容 4 5 6 7 2 3 3 b内容 1 4 3 8 5 ? 数位 0 1 2 3 4 5 6 7 a内容 3 3 2 7 6 5 4 b内容 5 8 3 4 1 数位 对齐 存储 程序举例 大整数加法 大整数乘法 大整数除法 大整数加法 问题描述 求两个不超过 200 位的非负整数的和。 输入数据 有两行,每行是一个不超过 200 位的非负整数,没有多余的前导 0。 输出要求 一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不能输出为 0342。 输入样例 输出样例 22222222222222222222 33333333333333333333 55555555555555555555 大整数加法 #define MAX_LEN 200 int an1[MAX_LEN+10]; int an2[MAX_LEN+10]; char szLine1[MAX_LEN+10]; char szLine2[MAX_LEN+10]; 大整数加法——main() scanf(%s, szLine1); scanf(%s, szLine2); int i; //库函数 memeset 将地址 an1 开始的 sizeof(an1)字节内容置成 0 //sizeof(an1)的值就是 an1 的长度 //memset 函数在 string.h 中声明 memset( an1, 0, sizeof(an1)); memset( an2, 0, sizeof(an2)); 大整数加法——main() //下面将 szLine1 中存储的字符串形式的整数转换到 an1 中去, //an1[0]对应于个位 int nLen1 = strlen( szLine1); j=0 for( i = nLen1 - 1;i = 0 ; i --) an1[j++] = szLine1[i] - 0; int nLen2 = strlen(szLine2); j=0 for( i = nLen2 - 1;i = 0 ; i --) an2[j++] = szLine2[i] - 0; 大整数加法——main() for( i = 0;i MAX_LEN ; i ++ ) { an1[i] += an2[i]; //逐位相加 if( an1[i] = 10 ) { //看是否要进位 an1[i] -= 10; an1[i+1] ++; //进位 } } bool bStartOutput = false; //此变量用于跳过多余的 0 for( i = MAX_LEN; i = 0; i -- ) { if( bStartOutput) printf(%d, an1[i]); //如果多余的 0

文档评论(0)

wangsux + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档