原题链接:蓝桥杯基础练习VIP-高精度加法
解题思路:
按照手算列竖式的方法做模拟运算,结果用字符串存储即可。
注意事项:
对进位的处理要谨慎。
参考代码:
//头文件引入 #include<iostream> #include <string> #include <cmath> //字符串反转 std::string reverse(std::string s) { return std::string(s.rbegin(), s.rend()); } //末尾补0,使字符串长度对齐 void add0end(std::string &s1, int len) { std::string temp = ""; while (len--) { temp += '0'; } s1 = s1 + temp; } //计算两加数间的差位,并在高位补0 int sublen(std::string &s1, std::string &s2) { int subl = s1.size() - s2.size(); //若长度相等,直接返回计算长度 if (subl == 0) { return s1.size(); } //若长度不等,计算差位并对字符串长度短的加数高尾补0,使俩字符串长度相等 else if (subl < 0) { add0end(s1, abs(subl)); return s2.size(); } else { add0end(s2, subl); return s1.size(); } } std::string add(std::string s1, std::string s2) { //输入检查,若有非数字非法字符混入字符串,直接返回空串 for (auto i = s1.begin(); i != s1.end(); i++) { if ((char) (*i) < '0' || (char) (*i) > '9') { return "\0"; } } for (auto i = s2.begin(); i != s2.end(); i++) { if ((char) (*i) < '0' || (char) (*i) > '9') { return "\0"; } } //转置字符串,res字串用来存储计算结果 std::string fac1 = reverse(s1), fac2 = reverse(s2), res = ""; //手算竖式中的相应位置对齐,len存储加数位数 int len = sublen(fac1, fac2); //存储进位的临时变量 int temp = 0; //模拟列竖式手算,用一个循环逐位相加 for (int i = 0; i < len; i++) { //类型转换,方便后续计算 int a = fac1[i] - '0'; int b = fac2[i] - '0'; //当前位结果=加数1当前位数字+加数2当前位数字+前一位计算结果的进位 res += (a + b + temp) % 10 + '0'; //重新计算当前结果的进位情况 temp = (a + b + temp) / 10; } //对最终进位做处理,一位数加法的结果最大为9(加数1)+9(加数2)+1(进位)=19,即进位最大为1 if (temp != 0) { res = res + '1'; } //返回结果,注意之前做了转置,这里要转置回去 return reverse(res); } int main() { std::string s1,s2; std::cin>>s1>>s2; std::cout<<add(s1,s2)<<std::endl; return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复