大明A+B

  
  

大明A+B

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12479    Accepted Submission(s): 4536
Problem 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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define MAX 410
using namespace std;

int main()
{
    int w1,w2,l1,l2,p;//w1,w2分别表示第一个数和第二个数小数点的位置,l1,l2分别表示数字的长度,p表示进位
    int i,j,k;
    char n1[MAX],n2[MAX];
    int n[MAX],m[MAX];
    while(~scanf("%s %s",n1,n2))
    {
        memset(n,0,sizeof(n));//初始化
        memset(m,0,sizeof(m));
        l1=strlen(n1);l2=strlen(n2);
        for(i=0;i<l1;i++)//获取两个数小数点的位置
        {
            if(n1[i]=='.')
            {
                w1=i;
                break;
            }
        }
        if(i==l1)//若为整数补全小数部分
        {
            w1=l1;
            n1[w1]='.';
            n1[w1+1]='0';
            l1=l1+2;
        }
        for(i=0;i<l2;i++)
        {
            if(n2[i]=='.')
            {
                w2=i;
                break;
            }
        }
        if(i==l2)
        {
            w2=l2;
            n2[w2]='.';
            n2[w2+1]='0';
            l2=l2+2;
        }
        //求小数部分(直接相加)
        k=0;p=0;
        for(i=w1+1;i<l1;i++)
        {
            m[k]=n1[i]-'0';
            k++;
        }
        k=l2-w2-2;
        for(i=l2-1;i>w2;i--)
        {
            m[k]+=(n2[i]-'0')+p;;
            p=m[k]/10;
            m[k]=m[k]%10;
            k--;
        }
        //求整数部分
        k=0;
        for(i=w1-1,j=w2-1;i>=0&&j>=0;i--,j--)
        {
            n[k]+=n1[i]-'0'+n2[j]-'0'+p;
            p=n[k]/10;
            n[k]=n[k]%10;
            k++;
        }
        for(i=i;i>=0;i--)
        {
            n[k]+=n1[i]-'0'+p;
            p=n[k]/10;
            n[k]=n[k]%10;
            k++;
        }
        for(j=j;j>=0;j--)
        {
            n[k]+=n2[j]-'0'+p;
            p=n[k]/10;
            n[k]=n[k]%10;
            k++;
        }
        if(p!=0)
        {
            n[k]=p;
            k++;
        }
        for(i=MAX-1;i>=0;i--)//求要输出的不为0的数开始的位置
        {
            if(n[i]!=0)
                break;
        }
        if(i!=-1)//把整数输出
        {
            for(k=i;k>=0;k--)//此处不能用i,否则会影响下面的数i的判断
            {
                printf("%d",n[k]);
            }
        }
        for(j=MAX-1;j>=0;j--)
        {
            if(m[j]!=0)
                break;
        }
        if(i==-1&&j==-1)//如果全部为0,直接输出0
        {
            printf("0\n");
        }
        if(i==-1&&j>=0)//只有小数的时候输出前提
        {
            printf("0.");
            for(k=j;k>=0;k--)
            {
                printf("%d",m[k]);
            }
        }
        if(i>=0&&j!=-1)//分别分情况讨论
        {
            printf(".");
            for(k=0;k<=j;k++)
            {
                printf("%d",m[k]);
            }
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值