总时间限制: 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;
}