原题链接:蓝桥杯基础练习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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复