题解 | #浮点数加法#
浮点数加法
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8
#include <iostream>
using namespace std;
string f_plus(string s1, string s2)
{
//ans1是小数部分, ans2整数部分
string ans1, ans2;
//是否进位,整数小数通用
bool ad = false;
//进行小数点对齐
int idx1, idx2;
for(int i = 0; s1[i]; i++)
if(s1[i] == '.') idx1 = i;
for(int i = 0; s1[i]; i++)
if(s2[i] == '.') idx2 = i;
int i = s1.size() - idx1 - 1, j = s2.size() - idx2 - 1;
int cnt1 = 1, cnt2 = 1;
//小数部分加减
while(i && j)
{
if(i > j)
{
ans1 += s1[s1.size() - cnt1++];
i--;
}
else if(i < j)
{
ans1 += s2[s2.size() - cnt2++];
j--;
}
else
{
int x = s1[s1.size() - cnt1++] - '0', y = s2[s2.size() - cnt2++] - '0';
int sum = x + y + ad;
ans1 += (sum % 10) + 48;
if(sum / 10) ad = true;
else ad = false;
i--,j--;
}
}
//小数部分进行倒置得到小数部分答案
for(int i = 0; i < ans1.size() / 2; i++)
{
char t = ans1[i];
ans1[i] = ans1[ans1.size() - (i + 1)];
ans1[ans1.size() - (i + 1)] = t;
}
//进行小数点对齐
i = idx1 - 1, j = idx2 - 1;
//整数部分加减
while(i >= 0 && j >= 0)
{
int x = s1[i] - '0', y = s2[j] - '0';
int sum = x + y + ad;
ans2 += (sum % 10) + 48;
if(sum / 10) ad = true;
else ad = false;
i--,j--;
}
while(i >= 0)
{
int x = s1[i] - '0' + ad;
ans2 += (x % 10) + 48;
if(x / 10) ad = true;
else ad = false;
i--;
}
while(j >= 0)
{
int x = s2[j] - '0' + ad;
ans2 += (x % 10) + 48;
if(x / 10) ad = true;
else ad = false;
j--;
}
//整数部分进行倒置得到小数部分答案
for(int i = 0; i < ans2.size() / 2; i++)
{
char t = ans2[i];
ans2[i] = ans2[ans2.size() - (i + 1)];
ans2[ans2.size() - (i + 1)] = t;
}
return ans2 + "." + ans1;
}
int main() {
string s1, s2;
while(cin >> s1 >> s2)
{
cout << f_plus(s1, s2) << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
