• 高精读整数加法【循环总结】


    高精度整数加法_牛客题霸_牛客网 (nowcoder.com)

    题目大意就是两个大整数相加

    解决代码

    #include 
    #include 
    #include 
    using namespace std;
    
    string a, b;
    
    void input() {
        cin >> a >> b;
    }
    
    string ans = "";
    
    void deal() {
        int aLen = a.length() - 1 , bLen = b.length() - 1;
    
        int carry = 0;
        while(aLen >= 0 || bLen >= 0){
            char a1 = aLen >= 0 ? a[aLen--] : '0';
            char b1 = bLen >= 0 ? b[bLen--] : '0';
            int sum = (a1 - '0') + (b1 - '0') + carry;
            ans +=  (sum % 10 + '0') ;
            carry = sum / 10;
        }
        if(carry != 0){
            ans += (carry + '0');
        }
    }
    void output() {
        for(int i = ans.length() - 1 ; i >= 0 ; i --){
            cout << ans[i];
        }
    }
    
    int main() {
        input();
        deal();
        output();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    代码解释

    输入

    字符串形式输入两个整数

    处理函数——逐位相加

    循环条件确定

    我们需要对两个字符串循环处理,但是若是两个循环貌似就将多余了,之前有些想不明白应该怎么做

    其实很简单,因为

    • 两个条件都是需要满足
    • 同时执行

    所以,只需要在循环中用两个条件用 相连即可

    while(n >= 0 || m >= 0)
    
    • 1

    这样就可以同时访问两个字符串,并且会在长度最长的字符串时终止循环

    获取单个元素

    因为在循环中,我们不清楚哪个长度长,因此需要利用三元表达式进行判断获取值

    并在处理时,对于长度不够的,进行 补零 处理。

    int a1 = aLen >= 0 ? a[aLen--] : '0';
    int b1 = bLen >= 0 ? b[bLen--] : '0';
    
    • 1
    • 2

    代码中其实就包含了 抽象 的计算机思维,因为对于计算机来说,a和b本质上没有区别,仅仅只需要在它没有的时候,给零处理就行

    当然,其实可以同样通过三元表达式确定最长的字符串

    string max = a.length() > b.length() ? a : b;
    
    • 1

    但是这将会 浪费空间 并且 其实我们没有必要知道哪个长,因为只需要对短的进行补零就行

    逐位相加

    在从字符串中获取单个字符之后,就可以将其转换为数字——通过- '0'实现

    并进行相加

    这里需要注意的是,因为需要处理上一位相加的进位

    因此,需要在相加时 ,加上进位的变量

    因为在第一次相加时,是不可能产生进位的(因为没有上一位的运算),所以将表示进位的变量carry设置初始值为0

    而在后面的运算中,carry的值将会根据运算情况进行改变

    int sum = (a1 - '0' ) + (b1 - '0') + carry;
    
    • 1

    判断溢出情况

    在完成运算跳出循环时,很可能第一位的相加也产生进位,但是无法在循环中处理

    因此,需要在循环外进行特殊处理

    if(carry != 0){
    	ans += (carry + '0');
    }
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Spring整合RabbitMQ-配制文件方式-1-消息生产者
    异步非阻塞python3代码
    Spring项目-前端问题:Can‘t find variable:$
    【算法练习】数组操作
    Harmony 个人中心(页面交互、跳转、导航、容器组件)
    数据分析------知识点(六)
    多约束、多车辆VRP问题(Matlab代码实现)
    Python系列模块之标准库json详解
    ARPG----C++学习记录03 Section7位置,偏移,函数
    Cyber RT 使用
  • 原文地址:https://blog.csdn.net/qq_22841387/article/details/126745135