蒜头君让你帮忙求 2 个实数相加的和。
输入输出中出现的实数都有如下的形式: P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非负整数;对于小数部分,至少有一位且最后一位Qj不等于0
输入格式
22 行,分别是两个加数。每个加数不超过 100100个字符。
输出格式
一行输出是相应的和。数据保证一定是一个小数部分不为 00 的实数。
样例输入
0.111111111111111111111111111111
0.111111111111111111111111111111
样例输出
0.222222222222222222222222222222
#include <bits/stdc++.h>
using namespace std;
int main()
{
string x,y;
cin >> x >> y;
int lenx = x.length(), leny = y.length();
int tx, ty;
//记录小数点位置
for(int i = 0; i < lenx; i++)
{
if(x[i] == '.')
{
tx = i;
break;
}
}
for(int i = 0; i < leny; i++)
{
if(y[i] == '.')
{
ty = i;
break;
}
}
//小数点对齐
while(tx < ty)
{
x = '0' + x;
tx++;
lenx++;
}
while(ty < tx)
{
y = '0' + y;
ty++;
leny++;
}
//等号对齐
while(lenx < leny)
{
x = x + '0';
lenx++;
}
while(leny < lenx)
{
y = y + '0';
leny++;
}
int len = x.length();
int flag = 0;
//小数加法
for(int i = len-1; i > tx; i--)
{
x[i] = x[i] - '0' + y[i];
if(x[i] > '9')
{
x[i] = (x[i] - '0') % 10 + '0';
if(i == tx+1)
flag = 1;
else
x[i-1] = x[i-1] + 1;
}
}
//小数向整数有进位
if(flag)
x[tx-1] = x[tx-1] + 1;
//整数加法
for(int i = tx-1; i > 0; i--)
{
x[i] = x[i] - '0' + y[i];
if(x[i] > '9')
{
x[i] = (x[i] - '0') % 10 + '0';
x[i-1] = x[i-1] + 1;
}
}
x[0] = x[0] - '0' + y[0];
if(x[0] > '9')
{
x[0] = (x[0] - '0') % 10 + '0';
x = '1' + x;
}
//去掉小数末尾的0
int ans = lenx;
for(int i = lenx - 1; i >= 0; i--){
if(x[i] == '0')
{
ans = i;
}
else
{
break;
}
}
for (int i = 0; i < ans; i++)
{
cout<<x[i];
}
return 0;
}