【算法笔记5.6小节 -大整数运算 】问题 C: 浮点数加法

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/xunalove/article/details/88250033

题目描述

求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj
对于整数部分,P1P2...Pi是一个非负整数
对于小数部分,Qj不等于0

输入

对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符

输出

每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数

样例输入

2
3.756
90.564

4543.5435
43.25

样例输出

94.32
4586.7935

易错

  1. 输入0.0 + 0.0 = 0.0
  2. 字符数组增加或者减少后要加'\0'作为结束标志。(切记切记切记)
    #include<stdio.h>
    #include<math.h>
    #include<algorithm>
    #include<string.h>//memset的头文件
    using namespace std;
    struct bign
    {
        int d[101];//数组要开的足够大,切记切记,这里错误了一次
        int len ;//总长度
        bign()
        {
            memset(d,0, sizeof(d));
            len = 0;
        }
    };
    int Find(char s[])//返回小数点的位数
    {
        for(int i=0; i<strlen(s); i++)
        {
            if(s[i]=='.')
                return strlen(s)-i-1;
        }
    }
    bign change(char s[])//将字符串转换为整型
    {
        bign a;
        for(int i=strlen(s)-1; i>=0; i--)
        {
            if(s[i]!='.')
                a.d[a.len++] = s[i]-'0';
        }
        return a;
    
    }
    bign add(bign a, bign b)
    {
        bign c;
        int carry = 0, temp;
        for(int i=0; i<a.len||i<b.len; i++)
        {
            temp = a.d[i] + b.d[i] + carry;
            c.d[c.len++] = temp % 10;
            carry = temp /= 10;
        }
        if(carry!=0)
            c.d[c.len++]= carry;
        return c;
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        getchar();
        while(n--)
        {
            char s1[101], s2[102];
            scanf("%s %s", s1, s2);
            int len1 = Find(s1),len2 = Find(s2), t=0, pindex;
            pindex = max(len1, len2);
            if(len1<len2) //len2++
            {
                t = strlen(s1);
                for(int i=0; i<len2-len1; i++)
                    s1[t++] = '0';
                s1[t] = '\0';
            }
            else //len1 >= len2
            {
                t = strlen(s2);
                for(int i=0; i<len1-len2; i++)
                    s2[t++] = '0';
                s2[t] = '\0';//切记切记切记,字符数组要加'\0'
            }
          
            bign a, b;
            a = change(s1);
            b = change(s2);
            bign ans = add(a, b);
    
            for(int i=ans.len-1; i>=pindex; i--)//输出整数部分
                    printf("%d",ans.d[i]);
            printf(".");
            //小数部分0~pindex-1
            int i;
            for(i=0; i<pindex; i++)
            {
                if(ans.d[i]!=0)
                    break;
            }
            for(int j=pindex-1; j>=i;j--)
                printf("%d",ans.d[j]);
            if(i==pindex)
                printf("0");
            printf("\n");
            getchar();//接受空行
        }
        return 0;
    }
    /*
    
    
    */
    

猜你喜欢

转载自blog.csdn.net/xunalove/article/details/88250033
今日推荐