解题思路:

    按照手算列竖式的方法做模拟运算,结果用字符串存储即可。
注意事项:
    对进位的处理要谨慎。
参考代码:

//头文件引入
#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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论