美文网首页
CUC-SUMMER-3-M

CUC-SUMMER-3-M

作者: Nioge | 来源:发表于2017-08-03 09:39 被阅读0次
    M - 大明A+B
    HDU-1753

    话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
    这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。

    现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。

    Input
    本题目包含多组测试数据,请处理到文件结束。
    每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

    Output
    请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。

    Sample Input
    1.1 2.9
    1.1111111111 2.3444323343
    1 1.1
    Sample Output
    4
    3.4555434454
    2.1


    解法:高精度计算,用长度为1000的数组来存储,前500位存整数部分,后500位存小数部分,输出的情况很多需要注意。

    代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    char str1[500],str2[500];
    int x[1000],y[1000],z[1000];
    void op()
    {
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        memset(y,0,sizeof(z));
        int a,b;
        a=strlen(str1);
        if(strchr(str1,'.')!=NULL){
            b=strchr(str1,'.')-str1;
            for(int i=b-1;i>=0;i--)
                x[501-b+i]=str1[i]-'0';
            for(int i=b+1;i<a;i++)
                x[500+i-b]=str1[i]-'0';
        }
        else
            for(int i=a-1;i>=0;i--)
                x[501-a+i]=str1[i]-'0';
        a=strlen(str2);
        if(strchr(str2,'.')!=NULL){
            b=strchr(str2,'.')-str2;
            for(int i=b-1;i>=0;i--)
                y[501-b+i]=str2[i]-'0';
            for(int i=b+1;i<a;i++)
                y[500+i-b]=str2[i]-'0';
        }
        else
            for(int i=a-1;i>=0;i--)
                y[501-a+i]=str2[i]-'0';
        int c=0;
        for(int i=999;i>=0;i--){
            z[i]=x[i]+y[i]+c;
            c=z[i]/10;
            z[i]%=10;
        }
    }
    int main()
    {
        while(cin>>str1>>str2){
            op();
            int flag=0;
            int f=-1;
            for(int i=0;i<=500;i++){
                if(z[i]!=0){
                    f=i;
                    break;
                }
            }
            if(f==-1)
                cout<<0;
            else
                for(int i=f;i<=500;i++){
                    if(z[i]!=0)
                        flag=1;
                    if(flag==0)
                        continue;
                    else
                        cout<<z[i];
                }
            f=-1;
            for(int i=999;i>500;i--){
                if(z[i]!=0){
                    f=i;
                    break;
                }
            }
            if(f!=-1){
                cout<<".";
                for(int i=501;i<=f;i++){
                    cout<<z[i];
                }
            }
            cout<<endl;
        }
    }
    

    相关文章

      网友评论

          本文标题:CUC-SUMMER-3-M

          本文链接:https://www.haomeiwen.com/subject/edbulxtx.html