小数高精度乘法
来源:互联网 发布:ubuntu 杀死所有进程 编辑:程序博客网 时间:2024/05/01 06:52
函数模板代码:
const int size=1000; //大数位数void mult(char* A,char* B,char* ans){ //A*B=ans int i,j,k; int fract; //总小数个数 int dot=-1; //小数点位置 for(k=0; A[k]!='\0'; k++) if(A[k]=='.') dot=k; int lena=k; if(dot==-1) fract=0; else fract=lena-dot-1; dot=-1; for(k=0; B[k]!='\0'; k++) if(B[k]=='.') dot=k; int lenb=k; if(dot==-1) fract+=0; else fract+=(lenb-dot-1); //总小数个数 int a[size+1]= {0}; int b[size+1]= {0}; int pa=0,pb=0; /*倒序*/ for(i=lena-1; i>=0; i--) { if(A[i]=='.') continue; a[pa++]=A[i]-'0'; } for(j=lenb-1; j>=0; j--) { if(B[j]=='.') //暂时删除小数点 continue; b[pb++]=B[j]-'0'; } int c[2*size+1]= {0}; int lenc; for(pb=0; pb<lenb; pb++) { int w=0; //低位到高位的进位 for(pa=0; pa<=lena; pa++) // = 为了处理最后的进位 { int temp=a[pa]*b[pb]+w; w=temp/10; temp=(c[pa+pb]+=temp%10); c[lenc=pa+pb]=temp%10; w+=temp/10; } } /*倒序,得到没有小数点的ans*/ for(pa=0,pb=lenc; pb>=0; pb--) ans[pa++]=c[pb]+'0'; ans[pa]='\0'; lena=pa; /*插入小数点*/ bool flag=true; //标记是否需要删除小数末尾的0 if(fract==0) //小数位数为0,无需插入小数点 flag=false; else if(fract<lena) //小数位数小于ans长度,在ans内部插入小数点 { ans[lena+1]='\0'; for(i=0,pa=lena; pa>0; pa--,i++) { if(i==fract) { ans[pa]='.'; break; } else ans[pa]=ans[pa-1]; } } else //小数位数大于等于ans长度,在ans前面恰当位置插入小数点 { char temp[size+1]; strcpy(temp,ans); ans[0]='0'; ans[1]='.'; for(int i=0; i<fract-lena; i++) //补充0 ans[i+2]='0'; for(j=i,pa=0; pa<lena; pa++) ans[j++]=temp[pa]; ans[j]='\0'; } /*删除ans小数末尾的0*/ if(flag) { lena=strlen(ans); pa=lena-1; while(ans[pa]=='0') ans[pa--]='\0'; if(ans[pa]=='.') //小数全为0 ans[pa--]='\0'; } /*删除ans整数开头的0,但至少保留1个0*/ pa=0; while(ans[pa]=='0') //寻找ans开头第一个不为0的位置 pa++; if(ans[pa]=='\0') //没有小数 { ans[0]='0'; ans[1]='\0'; } else //有小数 { for(i=0; ans[pa]!='\0'; i++,pa++) ans[i]=ans[pa]; ans[i]='\0'; } return;}
- 小数高精度乘法
- 高精度乘法(小数)
- POJ 2390 (小数高精度乘法)
- hdu 1063 Exponentiation (高精度小数乘法)
- POJ 1001 (坑爹的小数高精度乘法)
- poj 1001 uva 748 Exponentiation(高精度小数乘法)
- 高精度小数
- 高精度小数
- 高精度小数
- 高精度小数
- 高精度乘法
- 高精度乘法
- 高精度乘法
- 高精度乘法
- 高精度乘法
- 高精度乘法
- 高精度乘法
- 高精度乘法
- 关于flex4绘画板中加入文字的一些感悟
- javascript中escape,encodeURI,encodeURIComponent三个函数的区别
- Interleaving String
- USB子系统学习之基础篇一(相关术语及设备)
- C语言的基本数据类型总结
- 小数高精度乘法
- Android中GC_FOR_MALLOC的含义
- poj 1658 Eva's Problem(水题)
- 第I篇PCI体系结构概述
- 第1章 PCI总线的基本知识
- 1.1 PCI总线的组成结构
- USB子系统学习之基础篇二(驱动组织和结构)
- 1.2 PCI总线的信号定义
- 1.3 PCI总线的存储器读写总线事务