题目
题目链接http://lx.lanqiao.cn/problem.page?gpid=T142
问题描述
计算两个实数相加的结果。
输入的实数满足如下要求: (1) 小数点前的整数部分最多100位,(2) 小数点后的小数部分最多100位.
输入的实数满足如下要求: (1) 小数点前的整数部分最多100位,(2) 小数点后的小数部分最多100位.
输入格式
两行字符串,每行都是一个合法的实数。合法的意思是指: 整数部分的值如果大于零,则最高位数字必定大于零. 如果整数部分的值为零,则整数部分只有一个零. 小数部分尾部可以有任意多的零. 可以没有小数部分, 此时也没有小数点. 如果有小数点, 则至少需要有一位小数部分, 且允许是零.
输出格式
相加结果。注意: 小数部分末尾如果有连续的0, 则它们都是有效数字, 不能舍去. 如果是两个整数相加, 则结果仍为整数而没有小数部分.
样例输入
样例一: 0.0000000000000000000000000000000000000111111111000000000000000000 100000000000000000000000000000000000000000000000000000.0 样例二: 3 4 样例三: 3.9 2 样例四: 1.001 8.99999999999999999999999
样例输出
样例一:
100000000000000000000000000000000000000000000000000000.0000000000000000000000000000000000000111111111000000000000000000
样例二:
7
样例三:
5.9
样例四:
10.00099999999999999999999
思路
1. 模拟。整数部分、小数部分分别逐位进位相加。
代码#include <bits/stdc++.h>
using namespace std;
int main()
{
string a, b;
string af, bf, ai, bi;
string si,sf;
unsigned int isz,fsz;
unsigned int dpos;
while (getline(cin, a)) {
getline(cin, b);
af.clear();
bf.clear();
ai = a;
bi = b;
dpos = a.find('.', 0);
if (dpos != string::npos)
{
ai = a.substr(0, dpos);
af = a.substr(dpos+1, a.length()-dpos-1);
}
dpos = b.find('.', 0);
if (dpos != string::npos)
{
bi = b.substr(0, dpos);
bf = b.substr(dpos+1, b.length()-dpos-1);
}
isz = min(ai.size(), bi.size());
fsz = min(af.size(), bf.size());
si = bi;
sf = bf; //sf 为 af bf 中 位数最大的
if (ai.size() != isz) {
si = ai; swap(ai, bi);
}
if(af.size() != fsz) {
sf = af; swap(af, bf);
}
int cf = 0, indf = 0;
for(indf = fsz-1, cf = 0; indf >= 0; indf--) {
int s = sf[indf] - '0';
int a = af[indf] - '0';
s += (a+cf);
cf = s/10;
s %= 10;
sf[indf] = s + '0';
}
//整数部分 注意小数部分来的进位
reverse(si.begin(), si.end());
reverse(ai.begin(), ai.end());
int c, i;
for(i = 0, c = cf; i < isz; i++) {
int s = si[i] - '0';
int a = ai[i] - '0';
s += (a+c);
c = s/10;
s %= 10;
si[i] = s + '0';
}
while (c) {
if(i >= si.size()) { si += "0";}
int ss = si[i] - '0';
ss = (ss+c);
c = ss/10;
ss %= 10;
si[i] = ss + '0';
i++;
}
reverse(si.begin(), si.end());
reverse(ai.begin(), ai.end());
if (sf.length() == 0)
cout << si << endl;
else
cout << si << "." << sf << endl;
}
return 0;
}