网站大量收购独家精品文档,联系QQ:2885784924

第07章高精度计算重点.ppt

  1. 1、本文档共55页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
分析: 首先,题目中提到,整数的长度不会超过100位,所以这些整数只能采用字符数组读入。但在对每位进行求和时,可以采用字符形式,也可以采用整数形式。 本题用整数形式处理更方便。 样例输入: 1 99999278961257987 126792340765189 998954329065419876 432906541 23 0 方法:对读入的字符数组,以逆序的方式将各字符转换成对应的数值存放到整数数组(整数数组中剩余元素的值为0),然后再以整数方式求和,最后将求和的结果以相反的顺序输出各位。 在本题中,求和时要注意以下两点: 1)计算每位和时,得到的进位可能大于1,如图7.4所示。 2)累加各大数得到的和,其位数可能会比参与运算的大数的位数还要多。稍加分析即可得出结论,如果参与求和运算的大数最大长度为maxlen,因为参加求和运算的大数个数不超过100个,所以求和结果长度不超过maxlen+2。因此求和时可以一直求和到maxlen+2位,然后去掉后面的0,再以相反的顺序输出各位整数即可。 #include stdio.h #include string.h int main( ) { char buffer[200]; //存储(以字符形式)读入的每个整数 int array[200][200]; //逆序后的大数(每位是整数形式) int answer[200]; //及求得的和 int i, j, k; //循环变量 int num_integers; //读入整数的个数 int len, maxlen; //每个整数的长度,及这些整数的最大长度 int sum, carry, digit;//每位求和运算后得到的总和, 进位, 及该位的结果 int N; //测试数据的个数 scanf( %d, N ); for( k=1; k=N; k++ ) { maxlen = -1; memset( array, 0, sizeof(array) ); memset( answer, 0, sizeof(answer) ); for( num_integers = 0; num_integers 200; num_integers++ ) { gets( buffer ); if( strcmp(buffer, 0) == 0 ) break; len = strlen(buffer); if( lenmaxlen ) maxlen = len; for( i = 0; i len; i++ )//逆序存放大数的每位(整数形式) array[num_integers][i] = buffer[len - 1 - i] - 0; } carry = 0; for( i = 0; i maxlen+2; i++ ) //对这些整数的每位进行求和 { sum = carry; for( j = 0; j num_integers; j++ ) sum += array[j][i]; digit = sum % 10; carry = sum / 10; answer[i] = digit; } for( i = maxlen+2; i = 0; i-- ) //统计求和结果的位数 { if( answer[i] != 0 ) break; } while( i = 0 ) printf( %d, answer[i--] ); //逆序输出求和结果 printf( \n ); if( kN ) printf( \n ); //两个输出块之间有一个空行 } return 0; } 7.2.2 高精度数的乘法 初等数学里乘法的运算过程,如图7.5(a)所示。该运算过程有如下特点: 多位数的乘法是转换成1位数的乘法及加法来实现的,即把第二个乘数的每位数乘以第一个乘数,把得到的中间结果累加起来。 第二个乘数的每位数进行乘法运算的中间结果,是与第二个乘数参与运算的位右对齐的。如图(a)所示,第二个程序的第2位为7,参与乘法运算得到的中间结果“8638”是和7对齐的。 在初等数学里,乘法运算得到的每个中间结果都是处理了进位的:在中间结果里,一出现进位马上累加到高一位,如图(a)中的中间结果“11106”是已经处理了进位的结果。 但是,为方便程序实现,对中间结果的进位处理更方便的做法是等全部中间结果运算完后再统一处理。如图(b)所示,每个中间结果,“6 12 18 24”、“7 14 18 24”、“8 16 24 32”、“9 18 2

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档