大明A+B

来源:互联网 发布:周杰伦 红模仿知乎 编辑:程序博客网 时间:2024/04/30 20:43

大明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.91.1111111111 2.34443233431 1.1
 

Sample Output
43.45554344542.1

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#define MAX 410using 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;}

0 0
原创粉丝点击