坑爹的 小数加法

来源:互联网 发布:淘宝号注册马上注册 编辑:程序博客网 时间:2024/05/21 09:49
C - 大明A+B
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

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

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

Input

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

Output

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

Sample Input

1.1 2.91.1111111111 2.34443233431 1.1

Sample Output

43.45554344542.1
这个题真的是做哭了,妈呀,说多了都是泪啊,各种细节错误,一直a不过,痛苦啊,当最后看到Accepted的时候,真的是感觉要哭了。。。。。

#include <iostream>

#include <cstdio>

#include <algorithm>

#include <cmath>

using namespace std;

int main()

{

    char n1[410],n2[410];

    

    while(~scanf("%s%s",n1,n2))

    {

        int N1[410]={0},N2[410]={0},result[410]={0};//把去掉小数点后的数字编程整数保存在N1N2

        int n1p=0,n2p=0,length1,length2,i,j,int1,int2,point1,point2;

        int maxpoint,maxint;//maxpoint小数部分最长的位数 ,maxint整数部分最长的位数

        

        for(i=0;n1[i]!='\0';i++)

        {

            if(n1[i]=='.')

            {

                n1p=i;//确定n1小数点的位置

            }

        }

        if(n1p==0)

        {

            n1p=i;

            length1=i;

            point1=0;

            int1=i;

        }

        else

        {

            length1=i-1;//n1的长度

            int1=n1p;//n1的整数部分的位数

            point1=i-n1p-1;//n1的小数部分的位数

        }

        

        for(j=0;n2[j]!='\0';j++)

        {

            if(n2[j]=='.')

            {

                n2p=j;//确定n2小数点的位置

            }

        }

        if(n2p==0)

        {

            n2p=j;

            length2=j;

            point2=0;

            int2=j;

        }

        else

        {

            length2=j-1;//n2的长度

            int2=n2p;//n2的整数部分的位数

            point2=j-n2p-1;//n2的小数部分的位数

            

        }

        

        if(point1>point2)

            maxpoint=point1;

        else

            maxpoint=point2;

        

        

        

        //n2整数部分补零,并且把字符型数组变成int型数组

        if(int1>int2)

        {

            maxint=int1;

            int k=int1-int2,l,h;//k的值等于补完零以后的第一个数字的位置

            for(l=0,h=k;l<n2p;h++,l++)//l为原来字符数组的位置,hint数组的位置

            {

                N2[h]=n2[l]-'0';//n2的整数部分变成int型,赋值给N2

            }

            

            for(i=0;i<n1p;i++)//n1整数部分进行转变

                N1[i]=n1[i]-'0';

            for(j=n1p+1;j<length1+1;i++,j++)//n1的小数部分进行转变

                N1[i]=n1[j]-'0';

            

            for(i=n2p+1;i<length2+1;i++)//n2的小数部分进行转换

                N2[h++]=n2[i]-'0';

            

        }

        

        //n1整数部分补零,并且把字符型数组变成int型数组

        else

        {

            maxint = int2;

            int k=int2-int1,l,h;//k的值等于补完零以后的第一个数字的位置

            for(l=0,h=k;l<n1p;h++,l++)//l为原来字符数组的位置,hint数组的位置

            {

                N1[h]=n1[l]-'0';//n1的整数部分变成int型,赋值给N1

            }

            

            for(i=0;i<n2p;i++)//n2整数部分进行转变

            {

                N2[i]=n2[i]-'0';

            }

            for(j=n2p+1;j<length2+1;i++,j++)//n2的小数部分进行转变

            {

                N2[i]=n2[j]-'0';

            }

            

            for(i=n1p+1;i<length1+1;i++)//n1的小数部分进行转换

            {

                N1[h]=n1[i]-'0';

                h++;

            }

            

        }

        

        

        //进行加法运算

        int jinwei=0,extra=0;

        for(int k=maxint+maxpoint-1;k>=0;k--)

        {

            result[k]=(N1[k]+N2[k]+jinwei)%10;

            jinwei=(N1[k]+N2[k]+jinwei)/10;

        }

        extra=jinwei;

        

        //进行输出,注意输出最简形式,注意012.01230022.00

        int temp=0,nn=0;

        if(extra)

            printf("%d",extra);

        for(i=0;i<maxint;i++)

            printf("%d",result[i]);

        for(i=maxint+maxpoint-1;i>=maxint;i--)

        {

            if(result[i]==0 && temp==0);

            else

            {

                temp=1;

                nn=i;

                break;

            }

        }

        

        if(nn==0)

        {

            cout<<endl;

        }

        else

        {

            cout<<".";

            for(i=maxint;i<=nn;i++)

                cout<<result[i];

            cout<<endl;

        }

        

    }

    return  0;

    

}

0 0