实数加法

总时间限制: 1000ms 内存限制: 65536kB

描述

求2个实数相加的和。

输入输出中出现的实数都有如下的形式: P1P2…Pi.Q1Q2…Qj。对于整数部分,P1P2…Pi是一个非负整数;对于小数部分,至少有一位且最后一位Qj不等于0。

  • 输入
    2行,分别是两个加数。每个加数不超过100个字符。
  • 输出
    一行输出是相应的和。数据保证一定是一个小数部分不为0的实数。
  • 样例输入
    0.111111111111111111111111111111
    0.111111111111111111111111111111
  • 样例输出
    0.222222222222222222222222222222

题解:

–有点烦的高精度,注意小数的处理方法,还有末尾去零


代码:

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int MAXN=105;

string A,B;
int a[MAXN][2],b[MAXN][2];
int la[2],lb[2],lc[2],c[MAXN][2];

int main(){
    cin>>A>>B;
    while(A[la[0]]!='.')
        la[0]++;
    for(int i=0;i<la[0];i++)
        a[la[0]-1-i][0]=A[i]-'0';
    la[1]=A.length()-la[0]-1;
    for(int i=0;i<la[1];i++)
        a[i][1]=A[i+la[0]+1]-'0';

    while(B[lb[0]]!='.')
        lb[0]++;
    for(int i=0;i<lb[0];i++)
        b[lb[0]-1-i][0]=B[i]-'0';
    lb[1]=B.length()-lb[0]-1;
    for(int i=0;i<lb[1];i++)
        b[i][1]=B[i+lb[0]+1]-'0';

    int x=0;
    while(lc[0]<=la[0]||lc[0]<=lb[0]){
        c[lc[0]][0]=a[lc[0]][0]+b[lc[0]][0]+x;
        x=0;
        if(c[lc[0]][0]>=10){
            x=c[lc[0]][0]/10;
            c[lc[0]][0]%=10;
        }
        lc[0]++;
    }
    c[lc[0]][0]=x;
    x=0;
    while(!c[lc[0]][0]&&lc[0])
        lc[0]--;

    lc[1]=min(la[1],lb[1]);
    lc[1]--;
    while(lc[1]>=0){
        c[lc[1]][1]=a[lc[1]][1]+b[lc[1]][1]+x;
        x=0;
        if(c[lc[1]][1]>=10){
            x=c[lc[1]][1]/10;
            c[lc[1]][1]%=10;
        }
        lc[1]--;
    }
    c[0][0]+=x;
    for(int i=lc[0];i>=0;i--)
        cout<<c[i][0];
    int l=max(la[1],lb[1]);
    cout<<'.';
    for(int i=min(la[1],lb[1]);i<l;i++)
        if(a[i][1])
            c[i][1]=a[i][1];
        else
            c[i][1]=b[i][1];
    while(!c[l][1])
        l--;
    for(int i=0;i<=l;i++)
        cout<<c[i][1];
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41709770/article/details/79574546