题目
题目链接http://lx.lanqiao.cn/problem.page?gpid=T142
问题描述
计算两个实数相加的结果。
输入的实数满足如下要求: (1) 小数点前的整数部分最多100位,(2) 小数点后的小数部分最多100位.
输入的实数满足如下要求: (1) 小数点前的整数部分最多100位,(2) 小数点后的小数部分最多100位.
输入格式
两行字符串,每行都是一个合法的实数。合法的意思是指: 整数部分的值如果大于零,则最高位数字必定大于零. 如果整数部分的值为零,则整数部分只有一个零. 小数部分尾部可以有任意多的零. 可以没有小数部分, 此时也没有小数点. 如果有小数点, 则至少需要有一位小数部分, 且允许是零.
输出格式
相加结果。注意: 小数部分末尾如果有连续的0, 则它们都是有效数字, 不能舍去. 如果是两个整数相加, 则结果仍为整数而没有小数部分.
样例输入
样例一: 0.00000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000.0 样例二: 3 4 样例三: 3.9 2 样例四: 1.001 8.9
样例输出
样例一: 0000000000000000000000000000000000000000000.00000000000000000000000000000000000000000000000000000 样例二: 7 样例三: 5.9 样例四: 10.000
思路
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; }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/80796.html