高精度小数相加
来源:互联网 发布:家庭式音响推荐 知乎 编辑:程序博客网 时间:2024/05/20 18:47
本来想调用两次add()函数直接计算出整数和小数部分的加和,但是小数部分进位没办法被计算后边的整数部分得知,除非用一个全局变量来做标记,但是这样移植性就不好了,所以在flo_add()里先将小数部分直接算出来,记录进位,然后调用add()计算整数部分,再次调用add()把进位加到整数部分。
#include<stdio.h>#include<iostream>#include<string>#include<algorithm>using namespace std;string add(string st1,string st2){ if(st1.size()<=st2.size()) { string s=st1; st1=st2; st2=s; } reverse(st1.begin(),st1.end()); //将string类st1,st2逆转顺序 reverse(st2.begin(),st2.end()); int len1,len2; len1=st1.length(); //计算各自的长度 len2=st2.length(); int in=0,num; //进位in初始化为0 for(int i=0; i<len2; i++) { num=st1[i]-'0'+st2[i]-'0'+in; //各位的和 in=num/10; num%=10; st1[i]=num+'0'; //放入较长的string里 } for(int j=len2; j<len1; j++) //如果遇到例如123 99892这样的样例,123处理完后需要向前边进位 { num=st1[j]-'0'+in; in=num/10; num%=10; st1[j]=num+'0'; } if(in==1) //相加的结果比原有的string都长 { st1+="1"; } reverse(st1.begin(),st1.end()); return st1;}string flo_add(string st1,string st2){ string prest1,prest2,sufst1,sufst2,prest,sufst; int len1,len2,k; len1=st1.length(); len2=st2.length(); for( k=0;k<len1;k++) //获取小数点前后的值 { if(st1[k]=='.') break; prest1+=st1[k]; } for(int j=k+1;j<len1;j++) sufst1+=st1[j]; for( k=0;k<len2;k++) { if(st2[k]=='.') break; prest2+=st2[k]; } for(int j=k+1;j<len2;j++) sufst2+=st2[j]; int lmax,lmin,flag; if(sufst1.length()>=sufst2.length()) //小数部分补零对齐 { lmax=sufst1.length(); lmin=sufst2.length(); flag=1; } else { lmax=sufst2.length(); lmin=sufst1.length(); flag=2; } for(int i=lmin;i<lmax;i++) { if(flag==1) sufst2+='0'; else sufst1+='0'; } reverse(sufst1.begin(),sufst1.end()); //小数部分相加 reverse(sufst2.begin(),sufst2.end()); len1=sufst1.length(); int in=0,num; for(int i=0; i<len1; i++) { num=sufst1[i]-'0'+sufst2[i]-'0'+in; in=num/10; num%=10; sufst+=num+'0'; } reverse(sufst.begin(),sufst.end()); prest=add(prest1,prest2); string s; s+=in+'0'; prest=add(prest,s); //加上小数部分的进位 解决432.2736 67.873这样的数值 s=prest; s+='.'; s+=sufst; return s;}int main(){ int t; cin>>t; while(t--) { string str1,str2; cin>>str1>>str2; cout<<flo_add(str1,str2)<<endl; } return 0;}
样例:
10
432.27936
99.873
532.15236
899.0013
12.954
911.9553
456.27936
99.076
555.35536
0 0
- 高精度 两小数相加
- 高精度小数相加
- hdu1753 高精度小数相加
- hdu 1753 高精度小数相加
- 小数相加
- 高精度小数
- 高精度小数
- 高精度小数
- 高精度小数
- 高精度整数相加减
- 高精度大数相加
- 大数相加(高精度)
- nyoj 131 小数相加
- java 小数相加
- NYOJ131 小数相加 【字符串】
- 超长小数相加
- 两个小数相加
- 小数高精度乘法
- Java中的==和equals区别
- Color the ball
- C++ 重载运算符
- 学习笔记_毕向东 Java_继承_抽象类_接口_多态 2014.7.13
- ubuntu设置声音大小
- 高精度小数相加
- Qt学习(八) 关于托盘菜单不消失的问题
- Ubuntu14.04LTS下使用eclipse搭建Cocos2d-x的Android环境
- 关于友善之臂mini2440串口接超级终端输入显示乱码问题的解决方法
- 中缀表达式转后缀表达式
- 【环境配置】Linux的常用命令
- (华为机试)删除字符串中相同子串
- effecctive C++(一)
- java代理