高精度运算和简单优化方法(C语言)

高精度运算和简单优化方法(C语言)

ID:41057966

大小:51.50 KB

页数:8页

时间:2019-08-15

高精度运算和简单优化方法(C语言)_第1页
高精度运算和简单优化方法(C语言)_第2页
高精度运算和简单优化方法(C语言)_第3页
高精度运算和简单优化方法(C语言)_第4页
高精度运算和简单优化方法(C语言)_第5页
资源描述:

《高精度运算和简单优化方法(C语言)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、高精度运算和简单优化方法(C语言)收藏先介绍一种高精度的优化方法,事实上这种优化没有改变算法的时间复杂度,也就是没有改变他的增长曲线但却使增长变慢了。然后再介绍一下减法。现在常用的高精度计算方法是把字符串中每个字符转化为一个数倒序存储在另一个数组中,这样做既浪费空间,又没有时效。因为最简单的整型数char最大可以存储255,用它存储个位数浪费了很多空间。而且逐位计算也花费很多时间。不如让一个数存储尽可能多的位,这样对一个数组元素的计算只需要一次,那么总的循环次数相应的缩短为几分之一,比如让cha

2、r存储两位数(它不可以存储三位数因为最大的三位数999超出了它的范围)那么计算12+34的运算也相应的成为一次普通的计算,而不需要向原始的方法那样循环两次。我在下面这个程序中用了long,因为long可以存储最多10位的数,因此可以用它存储任意9位数,处理的时候注意如果它的位数不是九的倍数那么会有多余,把多余的放到最高位。这样做可以把循环次数缩小为1/9。这相当于是一个1000000000进制的计算,用10进制显示它的每一位,发现这样一个1000000000进制的数它的显示与10进制完全一样的。

3、但要注意的是,它的每一位输出必须为9位。如果10进制下小于九位则要在前面补零。比如某一位是100,在1000000000进制的数中要输出为000000100,c语言有该格式的应用,pascal中MS要计算前补零了,如果是最高位的话当然可以把前面的零省掉了。下面是该算法的程序#include#includeintmain(){chara1[100000],b1[100000];longa[10000]={0},b[10000]={0},c[10000]={0}

4、,sa,sb,la,lb,lena,lenb,p,i,j,k,x=0,lenc,l;gets(a1);//读入gets(b1);la=strlen(a1);//算长度lb=strlen(b1);sa=la%9;//计算每九位划分后的剩余位数sb=lb%9;lena=la/9;lenb=lb/9;k=1;for(p=sa-1;p>=0;p--){a[lena]+=(a1[p]-48)*k;k*=10;}//处理第一个加数,每九位划分后剩余的位数转化为一个数p=sa;for(i=lena-1;i>=

5、0;i--)//每九个字符转换为一个九位数存储在a[i]中{k=100000000;for(j=1;j<=9;j++){a[i]+=(a1[p]-48)*k;k/=10;p+=1;}}k=1;for(p=sb-1;p>=0;p--){b[lenb]+=(b1[p]-48)*k;k*=10;}//处理第二个加数,同上p=sb;for(i=lenb-1;i>=0;i--){k=100000000;for(j=1;j<=9;j++){b[i]+=(b1[p]-48)*k;k/=10;p+=1;}}i=

6、0;while((i<=lena)

7、

8、(i<=lenb))//计算{c[i]=a[i]+b[i]+x;x=c[i]/1000000000;c[i]%=1000000000;i++;}if(x!=0){lenc=i;c[lenc]=x;}//计算结果有没有增位elselenc=i-1;for(i=lenc;i>=0;i--)if(i!=lenc)printf("%09ld",c[i]);elseprintf("%ld",c[i]);//出开头按九位数输出return0;}以下是一个pascal的高

9、精度的乘法,原理同上,我只做了100进制,读者可以自己扩展。programacb;varla,lb,lc,x,i,j,l:integer;s,st:ansistring;a,b,c:array[1..100000]ofbyte;f1,f2:text;beginassign(f1,'qlwy.in');reset(f1);assign(f2,'qlwy.out');rewrite(f2);readln(f1,s);la:=length(s);l:=la;i:=1;whilel+2>0dobegin

10、ifl-1>0thenst:=s[l-1]+s[l]elsest:=s[l];val(st,a[i]);i:=i+1;l:=l-2;end;iflamod2=0thenla:=ladiv2elsela:=ladiv2+1;fori:=ladownto1dowriteln(f2,a[i]);readln(f1,s);lb:=length(s);l:=lb;i:=1;whilel+2>0dobeginifl-1>0thenst:=s[l-1]+s[l]elsest:=s[l];val(st,b[i]

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。