题目传送门
题目描述
求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0
输入描述:
对于每组案例,每组测试数据占2行,分别是两个加数。
输出描述:
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
输入
0.111111111111111111111111111111
0.111111111111111111111111111111
输出
0.222222222222222222222222222222
思路
模板题,倒置字符串,对齐小数点,模拟手算加法就好。
这道题即使没有去除后缀0的代码也能AC…
代码
#include<bits/stdc++.h>
#define MAXN 105
using namespace std;
string a,b;
void getab() {
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int bp=b.find(".");
int ap=a.find(".");
if (bp>ap) {
a.insert(0,bp-ap,'0');
} else {
b.insert(0,-bp+ap,'0');
}
if (a.size()<b.size()) {
swap(a,b);
}
}
int main () {
while (cin>>a>>b) {
string res="";
getab();
int lena=a.size();
int lenb=b.size();
int flag=0;
for (int i=0; i<lena; i++) {
char ans;
if (a[i]!='.' ) {
if (i<lenb) {
int an=a[i]-'0';
int bn=b[i]-'0';
ans=(an+bn+flag)%10+'0';
if (an+bn+flag>=10) {
flag=(an+bn+flag)/10;
} else {
flag=0;
}
} else {
int an=a[i]-'0';
ans=(an+flag)%10+'0';
if (an+flag>=10) {
flag=(an+flag)/10;
} else {
flag=0;
}
}
}else {
ans='.';
}
res=ans+res;
}
if (flag!=0){
char t=('0'+flag);
res=t+res;
}
//cout<<res<<endl;
//不加下面这些去除后缀0和小数点的代码,直接输出res也能AC
while (res[res.size()-1]=='0'){
res.erase(res.size()-1);
}
if (res[res.size()-1]=='.'){
res.erase(res.size()-1);
}
cout<<res<<endl;
}
return 0;
}