坑爹的 小数加法

C - 大明A+B
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 
这时他已经不是那个只会做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
 
    
这个题真的是做哭了,妈呀,说多了都是泪啊,各种细节错误,一直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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值