高精度小数相加

来源:互联网 发布:家庭式音响推荐 知乎 编辑:程序博客网 时间: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