实数加法

xiaoxiao2021-02-28  41

总时间限制: 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; }
转载请注明原文地址: https://www.6miu.com/read-2631453.html

最新回复(0)