求两个实数相加的和。
题目中输入输出里出现的浮点数都有如下的形式:
P1P2…Pi.Q1Q2…Qj。对于整数部分,P1P2…Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。
输入
2行,每行是一个加数。每个加数的长度不超过100。
输出
一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
样例输入
0.111111111111111111111111111111
0.111111111111111111111111111111
样例输出
0.222222222222222222222222222222
思路:
A:000aa.bb000
B:ccccc.ddddd
对于输入的两个数,缺位补零,使其位数相等,从右至左上下相加,满十进一,最后处理小数部分末尾可能出现的 0 。
代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
string a, b; cin >> a >> b;
int az = a.find(".");//a 的整数部分长度
int bz = b.find(".");
int ax = a.length() - az - 1;//a 的小数部分长度
int bx = b.length() - bz - 1;
int z, x;//整数、小数部分的最长长度
az > bz ? z = az : z = bz;
ax > bx ? x = ax : x = bx;
string saz = a.substr(0, az);//a 的整数部分
string sax = a.substr(az + 1);//a 的小数部分
string sbz = b.substr(0, bz);
string sbx = b.substr(bz + 1);
while (saz.size() != z)//整数部分补零
saz = "0" + saz;
while (sbz.size() != z)
sbz = "0" + sbz;
while (sax.size() != x)//小数部分补零
sax = sax + "0";
while (sbx.size() != x)
sbx = sbx + "0";
int c = 0;
string xiao = "", zheng = "";
for (int i = x - 1; i >= 0; i--) {//字符转 int :char -‘0’;int 转字符:4 + ‘0’
xiao += ((c + (sax[i] - '0') + (sbx[i] - '0')) % 10 + '0');
c = (c + (sax[i] - '0') + (sbx[i] - '0')) / 10;
}
for (int i = z - 1; i >= 0; i--) {
zheng += ((c + (saz[i] - '0') + (sbz[i] - '0')) % 10 + '0');
c = (c + (saz[i] - '0') + (sbz[i] - '0')) / 10;
}
if(c!=0)
zheng += (c + '0');
int k;//小数部分去零
for (k=0;k<xiao.length();k++)
if (xiao[k] != '0')
break;
reverse(zheng.begin(), zheng.end());
cout << zheng << ".";
for (int i = xiao.length() - 1; i >= k; i--)
cout << xiao[i];
cout << endl;
system("pause");
}