大数BigNum运算.pptVIP

  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文档。上传文档
查看更多
小试一把 /onlinejudge/showProblem.do?problemCode=1001 /showproblem.php?pid=1002 王建芳 2011.8 大数运算 引入 C/C++中的int类型能表示的范围是-2E31-2E31–1。unsigned类型能表示的范围是0-2E32–1,即 0-4294967295。所以,int和unsigned类型变量,都不能保存超过10位的整数。有时我们需要参与运算的数,可能会远远不止10 位,例如,可能需要保留小数点后面100位(比如求π的值),那么,即便使用能表示很大数值范围的double变量,但是由于double变量只有64位,所以还是不可能达到精确到小数点后面100位这样的精度。 引入 double变量的精度也不足以表示一个100位的整数。一般我们称这种基本数据类型无法表示的整数为大整数。如何表示和存放大整数呢?基本的思想就是:用数组存放和表示大整数。一个数组元素,存放大整数中的一位。 引入 那么,如何解决类似大整数这样的高精度计算问题呢?这就是我们今天学习的内容。 大数运算 大数是指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法表示的数值。 [例1:]求Fibonacci数列的第1000个数。 [例2:]计算pi到小数点后第2000位。 大数一般方法 用数组模拟大数的运算。 开一个比较大的整型数组,数组的元素代表数组的某一位。 通过对数组元素的运算模拟大数的运算。 将数组输出。 常用的大数算法 1. 大数的加/减法 2 . 大数的乘法 3 . 大数的除法 大整数加法 解题思路 题目很明确告诉是很长的大整数相加,所以采用大数的加法; 开一个整型数组,模拟加法: 注意加法是尾对齐的。 数据结构与算法 不需要特殊的数据结构; 大数一般使用数组模拟。 解题思路 13/33 首先要解决的就是存储200 位整数的问题。显然,任何C/C++固有类型的变量都无法保存它。最直观的想法是可以用一个字符串来保存它。字符串本质上就是一个字符数组,因此为了编程更方便,我们也可以用数组unsigned an[200]来保存一个200 位的整数,让an[0]存放个位数,an[1]存放十位数,an[2]存放百位数…… 那么如何实现两个大整数相加呢?方法很简单,就是模拟小学生列竖式做加法,从个位开始逐位相加,超过或达到10 则进位。也就是说,用unsigned an1[201]保存第一个数,用unsigned an2[200]表示第二个数,然后逐位相加,相加的结果直接存放在an1 中。要注意处理进位。另外,an1 数组长度定为201,是因为两个200 位整数相加,结果可能会有201 位。 实际编程时,不一定要费心思去把数组大小定得正好合适,稍微开大点也无所谓,以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。 14 大數加法 123456789 + 987654321 ? 把 123456789 存在 num1 之中,987654321 存在 num2,結果存在 answer 中 num1 num2 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 answer 0 carry 0 0 15/33 #include stdio.h #include string.h #define MAX_LEN 200 int an1[MAX_LEN+10]; int an2[MAX_LEN+10]; char szLine1[MAX_LEN+10]; char szLine2[MAX_LEN+10]; int main(void) { scanf(%s, szLine1); scanf(%s, szLine2); int i, j; memset( an1, 0, sizeof(an1)); memset( an2, 0, sizeof(an2)); 16/33 int nLen1 = strlen( szLine1); for( j = 0, i = nLen1 - 1;i = 0 ; i --) an1[j++] = szLine1[i] - 0; int nLen2 = strlen(szLine2); for( j = 0, i = nLen2 - 1;i = 0 ; i --) an2[j++] = szLine2[i] - 0; for( i = 0;i MAX_LEN ; i ++ )

文档评论(0)

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

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

1亿VIP精品文档

相关文档