小数A+B

Description

给你两个正的小数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

************************************************************************************************

    思路,就是按照两数相减的思路,就可以了。我采用的c语言版的!

************************************************************************************************

代码如下:

#include<stdio.h>
#include <iostream>
#include <string.h>

using namespace std;

char a[405],b[405];
char x[200],y[200],z[200],k[200];
int p[405],q[405];

///判断是不是含有小数点,随便解决多余的0
int fun(char s[])
{
    int q=0;
    for(int i=0; i<strlen(s); i++)
    {
        if(s[i]=='.')
        {
            q = i;
            break;
        }
    }
    if(q==1)
    {
        int i=strlen(s)-1;
        while(s[i]=='0')
        {
            s[i] = '\0';
            i--;
        }
        if(s[i]=='.')
        {
            s[i]='\0';
            return 0;
        }
    }
    return q;
}

void cmp(int lena,int t)
{
    if(t==1)
    {
        ///表示有小数点,
        if(lena!=0)
        {
            for(int i=0; i<lena; i++)
                x[i] = a[i];
            x[lena] = '\0';
            int j=0;
            for(int i=lena+1; i<strlen(a); i++,j++)
                y[j] = a[i];
            y[j]='\0';
        }
        else
            ///无小数点
            strcpy(x,a);
    }
    else
    {
        ///表示有小数点,
        if(lena!=0)
        {
            for(int i=0; i<lena; i++)
                z[i] = b[i];
            z[lena] ='\0';
            int j=0;
            for(int i=lena+1; i<strlen(b); i++,j++)
                k[j] = b[i];
            k[j]='\0';
        }
        else
            ///无小数点
            strcpy(z,b);
    }
}


void xiangjia(int len,int num,int t)
{
    int o = num-1;
    if(t==1)
    {
        for(int i = len-1 ; i>=0 ; i--,o--)
            p[o] = x[i]-'0';
        for(int i = 0 ; i<strlen(z) ; i++)
            p[i] += z[i]-'0';
    }
    else
    {
        for(int i = len-1 ; i>=0 ; i--,o--)
            p[o] = z[i]-'0';
        for(int i = 0 ; i<strlen(x) ; i++)
            p[i] += x[i]-'0';
    }
}

int wh(int l)
{
    int index =0;
    int i;
    for( i = l-1; i>=0; i--)
    {
        if(q[i] == 0 && index==0)
            continue;
        else
            break;
    }
    for(int j=0; j<=i; j++)
    {
        if(index==0)
        {
            printf(".");
            index=1;
        }
        printf("%d",q[j]);
    }
    printf("\n");
}

int main()
{
    int lena,lenb;
    while(scanf("%s %s",&a,&b)!=EOF)
    {
        memset(x,0,sizeof(x));
        memset(z,0,sizeof(z));
        memset(y,0,sizeof(y));
        memset(k,0,sizeof(k));
        memset(q,0,sizeof(q));
        memset(p,0,sizeof(p));
        int funa = fun(a);
        int funb = fun(b);
        cmp(funa,1);
        cmp(funb,2);

        ///前面一部分相加的结果
        int lenx = strlen(x);
        int lenz = strlen(z);
        int j = lenx>lenz?lenx:lenz;
        if(j!=lenx)
            xiangjia(lenx,j,1);
        else
            xiangjia(lenz,j,2);
        for(int i=j-1; i>0; i--)
        {
            if(p[i]>=10)
            {
                p[i-1]+=p[i]/10;
                p[i]=p[i]%10;
            }
        }
        ///后一部分相加的结果
        int l = strlen(k)>strlen(y)?strlen(k):strlen(y);
        for(int i=0; i<strlen(k); i++)
            q[i] = k[i]-'0';
        for(int i=0; i<strlen(y); i++)
            q[i] += y[i]-'0';
        ///之前的
        for(int i=l-1; i>0; i--)
        {
            if(q[i]>=10)
            {
                q[i-1] += q[i]/10;
                q[i] = q[i]%10;
            }
        }

        ///合并了得最后的值
        if(q[0]>=10)
        {
            int num = q[0]/10;
            q[0] = q[0]%10;
            int i = j-1;
            p[i] += num;
            while(p[i]>=10 && i>0)
            {
                p[i-1] += p[i]/10;
                p[i] = p[i]%10;
                i--;
            }
        }
        ///输出前面的头部
        for(int i=0; i<j; i++)
            printf("%d",p[i]);
        ///尾部调用输出
        wh(l);
    }
    return 0;
}


posted @ 2017-10-11 21:30  让你一生残梦  阅读(295)  评论(0编辑  收藏  举报