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