HDU 1753

带小数点的大数加法,思路:1、记录小数点的位置,然后把他去掉,因为带小数点遇到进位不好算。2、按照大数加法,将没有小数点的大数加起来。(加的过程中如果记录到小数点位置,就把小数点加上)3、把小数部分多余的0去掉。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 410;
char a[maxn], b[maxn];
int s[maxn+maxn];
int main()
{
    char c;
    int alc, arc, blc, brc, i,j,k,l,len,sign;
    while(scanf("%c", &c) != EOF)
    {
        memset(s,0,sizeof(s));
        i=0;
        alc = 0;
        arc = 0;
        while(c != '.' && c != ' ')
        {
            a[i++] = c;
            alc++;
            scanf("%c", &c);
        }
        a[i++] = c;
        if(c != ' ')
        {
            scanf("%c", &c);
            while(c != ' ')
            {
                a[i++] = c;
                arc++;
                scanf("%c", &c);
            }
        }
        k=i-1;
        blc = 0;
        brc = 0;
        i=0;
        while((c=getchar()) != '.' && c != '\n')
        {
            b[i++] = c;
            blc++;
        }
        b[i++] = c;
        if(c != '\n' && c != EOF)
        {
            while((c=getchar()) != '\n' && c != EOF)
            {
                b[i++] = c;
                brc++;
            }
        }
        l = i-1;
        j=0;
        if(brc < arc)
        {
            len = arc-brc;
            while(len--)
                s[j++] = a[k--]-48;
        }
        else if(brc > arc)
        {
            len = brc-arc;
            while(len--)
                s[j++] = b[l--]-48;
        }
        len = min(arc,brc);
        sign = 0;
        for(i=1; i<=len; i++)
        {
            s[j] = sign + a[k]-48 + b[l]-48;
            if(s[j] > 9)
            {
                sign = 1;
                s[j] %= 10;
            }
            else
                sign = 0;
            j++;
            l--;
            k--;
        }
        s[j++] = -1;
        k--;
        l--;
        while(k>=0 || l>=0)
        {
            s[j] = sign+((k>=0) ? a[k] : '0')-48+((l>=0) ? b[l] : '0')-48;
            if(s[j] > 9)
            {
                sign = 1;
                s[j] %= 10;
            }
            else
                sign = 0;
            j++;
            k--;
            l--;
        }
        if(sign == 1)
            s[j++] = 1;
        k=0;
        while(s[k] == 0)
        {
            k++;
        }
        if(s[k] == -1)
            k++;
        for(i=j-1; i>=k; i--)
        {
            if(s[i] == -1)
            {
                cout << '.';
                continue;
            }
            cout << s[i];
        }
        cout << endl;
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/wangjunchengno2/article/details/79614698