趋势科技笔试第一题8.8
输入两个超长由数字和小数点组成字符串数字,计算其最后结果,要求:
不损失精度,
收尾不出现无意义的0;
不得使用字符意外的函数
输入:两个string
输出:最后两数结果
思路:
1.首先计算小数点位置,小数少的字符串后面补齐0;
2.设置连个迭代器,指向每个字符串的最后一位;
3.迭代器指向的字符对应的数字相加如果大于9,设置进位符为1;
4.循环进行,遇到小数点,原样打印。
5.判断哪个字符先到最开始位置,如果到达开始位置,则只对剩下的字符串和进位信息进行类似处理。
#include<iostream> #include<string> using namespace std; string add1(string& a1, string& a2) { int pos_a1 = a1.size()-a1.find('.'); int pos_a2 = a2.size()-a2.find('.'); int len = 0; if ((pos_a1 - pos_a2) > 0) { len = pos_a1 - pos_a2; for (int i = 0; i <len; i++) { a2 += "0"; } } else { len = pos_a2 - pos_a1; for (int i = 0; i <len; i++) { a1 += "0"; } } string::iterator p_a1 = a1.end() - 1; string::iterator p_a2 = a2.end() - 1; string res; int t = 0; while (p_a2>=a2.begin()&&p_a1>=a1.begin()) { if ((*p_a2) == '.'&&(*p_a1) == '.') { res += '.'; p_a2--; p_a1--; continue; } char tmp = ((*p_a1)-'0' + (*p_a2)-'0'+t); if (tmp <= 9) { res += to_string(tmp); if (t == 1) t = 0; } else if (tmp>9) { t = 1; res += to_string(tmp % 10); } if (p_a1 == a1.begin()) { break; } if (p_a2 == a2.begin()) { break; } p_a2--; p_a1--; } if (p_a1 == a1.begin()&&p_a2!=a2.begin()) { p_a2--; while (p_a2 >= a2.begin()) { if (t == 1) { int tmp = (*p_a2 - '0' + t); if (tmp > 9) { t == 1; res += to_string(tmp % 10); } else { res += to_string(tmp); if (t == 1) t = 0; } } else { res += *p_a2; } if (p_a2 == a2.begin()) break; p_a2--; } } if (p_a2 == a2.begin()&&p_a1!=a1.begin()) p_a1--; { while (p_a1 >= a1.begin()) { if (t == 1) { int tmp = (*p_a1 - '0' + t); if (tmp > 9) { t == 1; res += to_string(tmp % 10); } else { res += to_string(tmp); if (t == 1) t = 0; } } else { res += *p_a1; } if (p_a1 == a1.begin()) break; p_a1--; } } reverse(res.begin(), res.end()); string::iterator it = res.begin(); while (it != res.end()) { if (*it == '0') { res.erase(it); } else break; } it = res.end()-1; while (it != res.begin()) { if (*it == '0') { res.erase(it); it--; } else break; } return res; } int main() { string A, B; cin >> A >> B; string res = add1(A, B); cout << res; system("pause"); }