ACM培训材料1.ppt

ACM培训材料1.ppt

ID:48061929

大小:67.50 KB

页数:11页

时间:2020-01-13

ACM培训材料1.ppt_第1页
ACM培训材料1.ppt_第2页
ACM培训材料1.ppt_第3页
ACM培训材料1.ppt_第4页
ACM培训材料1.ppt_第5页
资源描述:

《ACM培训材料1.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、ACM培训材料高精度加法用高精度算N阶乘N!有几个0制作:陈江勇2008-7-13高精度加法我们知道计算机表示范围很有限,在VC中int-231~231-1最多可表示10位double虽然可以表示范围可到38位,但是有效位也只有15~16位如果我们要对几百位的整数要加,怎么办.这就是我这节要讲的内容.我们可以用数组来模拟高精度.如何用数组来表示高精度有如下一个大数如: 12354564646456我们这样用数组表示:数组下标小的存数位权重低的(即反过来存)假如我们数组的每一个变量只存一位(即可认为是一个十进制模拟)我们用数组intd[20]

2、在存:d[0]=6,d[1]=5,d[2]=4,d[3]=6,d[4]=4,……..用数组实现高精度加法如果我们要对两个数:876521445544和5555465445454进行相加先定义两个数组,a,b表示这两个数,然后用数组c来存结果a[0]=4,a[1]=4,a[2]=5,…….b[0]=5,b[1]=5,b[2]=5,…….c[0]=(a[0]+b[0])%10=9个位e=0c[1]=(a[1]+b[1])%10+e=9+e为前一位的进位,十位进位e=0(e=(a[1]+b[1]+e)/10)c[2]=(a[2]+b[2])%10

3、+e=0,百位进位e=1,依次下去,最后把数组输出就是结果(要倒过来输出)对上面例子的实现#include#include#defineNintmain(){inti,lc;inta[128]={4,4,5,5,4,4,1,2,5,6,7,8,0},la=11;intb[128]={4,5,4,5,4,4,5,6,4,5,5,5,5,0},lb=12;intc[128]={0};inte=0,p;for(i=0;i<=lb;i++){p=a[i]+b[i]+e;c[i]=p%10;e=p/10;}lc=

4、lb;while(e>0){lc++;c[lc]=e%10;e/=10;}for(i=lc;i>=0;i--){printf("%d",c[i]);}printf("");return0;}用高精度算N阶乘#include#defineM10000intd[1024],t,N;intmain(){inti,j,p,q;while(scanf("%d",&N)!=EOF){d[1]=1;t=1;for(i=1;i<=N;i++){p=0;for(j=1;j<=t;j++){q=d[j]*i+p;d[j]=q%M;p=q/

5、M;}while(p>0){t++;d[t]=p%M;p/=M;}}printf("%d",d[t]);for(i=t-1;i>=1;i--)printf("%04d",d[i]);printf("");}return1;}注意上面程序的M的好处上面M定义为10000,这样不仅提高了效率而且也节省了空间如果要你把N阶乘转成2或3进制你会吗?如:把18!转换成2进制.如果你不会,那么你还没对那个程序M深刻理解.N!末尾有多少个0很简单,只要N!有多少个5这个因子,就有多少个0.详细见课堂分析.作业fjnu:1743fjnu:1185fjn

6、u:1307fjnu:1191fjnu:1158谢谢!!

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

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

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