- 1、本文档共26页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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进位,减少计算次数,提高运行速度。
六、高精度习题
您可能关注的文档
最近下载
- (word)Java笔试题.docx VIP
- JAVA笔试题基础很全有答案.pdf VIP
- 三年(2022-2024)中考历史真题分类汇编(全国通用)专题30 第二次工业革命和近代科学文化(原卷版).docx VIP
- 2024年外研版七年级上册英语Unit 6综合检测试卷及答案.doc VIP
- 艺苑掇英 第69期 懷菊草堂藏近现代绘画专辑_12589541.pdf
- 2018中考物理复习备考讲座材料.ppt VIP
- 移动基站施工进度计划及保证措施.doc
- 集采管理规章制度.docx VIP
- 燃气泄漏报警与应急系统的设计.doc VIP
- 2016款东风本田艾力绅ELYSION_汽车使用手册用户操作图解驾驶指南车主车辆说明书电子版.pdf
文档评论(0)