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