实数相加_蓝桥杯

题目

题目链接http://lx.lanqiao.cn/problem.page?gpid=T142

问题描述

  计算两个实数相加的结果。
  输入的实数满足如下要求: (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 

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;
}


你可能感兴趣的:(蓝桥杯)