C++算法积累.doc

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C算法积累

算法一:高精度计算 一、数据输入 先将要计算的数据输入到内存中一般是按位存到数组中,按位对齐。 定义:第一位表示个位,n表示最高位。 1、利用字符串输入:先以字符串方式输入,再存入数组。对非法输入可以作检查,处理小数、有符号数比较方便。但需要对字符串操作比较熟悉。 字符串的输入和转换可用如下语句: int? a[100] = {0}, b[100] = {0}; int? ka, kb, kc; char? a1[100], b1[100]; scanf(“%s”, a1);?????????? /*也可用gets(a1);*/ scanf(“%s”, b1); ka = strlen(a1);? kb = strlen(b1); for(i = 0; ika; i++)? a[i] = a[ka – i - 1] – ‘0’;??? /*转换存入数组,未作检查*/ for(i = 0; ikb; i++)? a[i] = a[kb – i - 1] – ‘0’; ? 字符串类型操作: 连接函数???????????????????? strcat(str1, str2); 求字符串长度函数?????? strlen(str1)? 2、带小数、正负号问题 ①利用查找函数查找小数点(.)、正负号(+、-) ②记录小数点的位置和正负号。 ③处理符号位。 3、位数对齐问题 ①无小数位对齐:以个位对齐??? ②有小数位对齐:以小数点对齐 4、存储问题 ①一位一存储?????? ②四位一存储 二、估算结果位数 高精度计算的结果位数要估算好,以便赋初值和控制循环次数。 设A、B为两个高精度数,结果为C,用LA、LB、LC分别表示A、B、C的位数。 加法:C=A+B?????? LC=MAX(LA,LB)+1?????? 是最长的位数加1 减法:C=A-B LC=MAX(LA,LB)??? 是最长的位数 ?????? 乘法:C=A*B?????? LC=LA+LB ?????? 除法:问题比较复杂,求商、余数、小数、可以不可以除尽,精确到小数点后几位。 一般取较大的位数作为结果位数。 ?????? 阶乘、乘方的位数可以用对数求出。 1、XN的位数为计算 由数学知识可知:一个自然数的位数基本等于这个数的常用对数取整加1。由此可知对于XN来说它的位数为 = (int)n*log10(x) + 1 ??? 2、N!的位数计算 N!=N×(N-1)×(N-2)……×3×2×1 Log10(n!) = (int)(log10(n)+log10(n-1)+……+log10(2)+log10(1))+1 可用如下程序段求N!的位数: int i,n,j; ? double k=0; ? scanf(%d,n); ? for(i=1;i=n;i++) k+=log10(i); ? j=(int)k+1; 三、计算和进位问题 高精度计算要求自己来编写进位。进位存放在CI中。 加法: 一位存储,CI=AI+BI+CI,若CI10, 则CI=CI-10,CI+1=1 ?????? 四位存储,CI=AI+BI+CI,若CI10000,则CI=CI-10000,CI+1=1 减法:保证大数减小数。 一位存储,CI=AI-BI,若CI0,则CI=CI+10,AI+1=AI+1-1 ?????? 四位存储,CI=AI-BI,若CI0,则CI=CI+10000,AI+1=AI+1-1 乘法: 一位存储,Y=AI*BI+C,C=Y整除10,AI=Y取模10 ?????? 四位存储,Y=AI*BI+C,C=Y整除10000,AI=Y取模10000 除法比较复杂 ?????? 1、A、B两数都为高精度数,利用减法求解。 ?????? 2、A、B其中A为高精度数、B不是,可以利用除法。 ?????? 3、A、B其中A不是高精度数、B是高精度数,利用除法减法求解。 ?????? 4、A、B两数都不是高精度数,可以利用除法。精确到小数点后几位,判断循环小数。 乘法的控制: ?????? for(i = 0; i LA; i++) ????? for(j = 0; j LB; j++) ????????????? {? C[i + j ] = C[i + j ] + A[i] * B[j]; ???????????????????? C[i + j + 1] := C[i + j + 1] + C[i + j] / 10; C[i + j ] = C[i + j] % 10; ????????????? } 四、输出问题 可以直接输出数组、或字符串。注意小数点位置,首尾的零。 五、优化程序 每个数组位置存四位整数逢10000进位,减少计算次数,提高运行速度。 六、高精度习题

文档评论(0)

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

教师资格证持证人

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

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档