实数相加_蓝桥杯

来源:互联网 发布:百度seo排名点击软件 编辑:程序博客网 时间:2024/05/22 01:41

题目

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

问题描述

  计算两个实数相加的结果。
  输入的实数满足如下要求: (1)  小数点前的整数部分最多100位,(2) 小数点后的小数部分最多100位.
输入格式
  两行字符串,每行都是一个合法的实数。合法的意思是指:  整数部分的值如果大于零,则最高位数字必定大于零. 如果整数部分的值为零,则整数部分只有一个零. 小数部分尾部可以有任意多的零. 可以没有小数部分,  此时也没有小数点. 如果有小数点, 则至少需要有一位小数部分, 且允许是零.
输出格式
  相加结果。注意: 小数部分末尾如果有连续的0, 则它们都是有效数字,  不能舍去. 如果是两个整数相加, 则结果仍为整数而没有小数部分.
样例输入
样例一:0.0000000000000000000000000000000000000111111111000000000000000000100000000000000000000000000000000000000000000000000000.0样例二:34样例三:3.92样例四:1.0018.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;elsecout << si << "." << sf << endl;    }    return 0;}


0 0