当前位置: 首页 > article >正文

大数加法【算法解析、代码模板、思路简单清晰】

791. 高精度加法 - AcWing题库

算法解析

大数加法其实本质上就是模拟 小学我们学的加法运算 + 分治 的思想

我们将一个很大的数字,拆成一个数的加法——分治思想

如何存储

如果对于一个真正很大的数字来说,可能long long都不支持(最多支持19位数

但是一般来说大数都是1000位起步的,所以我们不能简单的使用long long进行处理,而是将其放在一个数组内,然后通过将每一位拆分出来,进行相加。

存放顺序

因为加法中设计到 进位 问题,所以我们需要首先计算个位数的

当然,也可以换一个角度进行考虑。因为我们是使用数组存储的,若将相加的结果放在前面的话,那么每计算一次都需要将后面的内容往后移一位空出第一位

代码模板

#include<iostream>
#include<vector>

using namespace std ;

string a , b ;

vector<int> add(vector<int> &A , vector<int>& B){
    vector<int> C;
    int carry = 0;
    for(int i = 0 ; i < A.size() || i < B.size() ; i ++){
        if(i < A.size()) carry += A[i];
        if(i < B.size()) carry += B[i];
        C.push_back(carry % 10);
        carry /= 10;
      
    }
    if(carry != 0){
        C.push_back(carry );
    }
  
    return C;
  
}

int main(){
    vector<int >A , B;
  
    cin >> a >> b;
  
    for(int i = a.size() - 1 ; i >= 0 ; i -- ) A.push_back(a[i] - '0');
    for(int i = b.size() - 1 ; i >= 0 ; i -- ) B.push_back(b[i] - '0');
  
    auto C = add(A , B );
  
    for(int i = C.size() - 1 ; i >=  0 ;  i --){
        cout << C[i];
    }
  
    return 0;
}

代码模板中我们采用的是vector其实本质上就是一个数组,但是它比较方便的是可以直接通过push_back添加数字进入数组的。

比较妙的一点

在函数add中,定义一个变量carry。判断当前是否需要添加A数组B数组,这里需要明白的一点就是,若是数字的位数不对(如199 + 1),那么将不会遍历内容为1的数组B

完成相加后,直接将carry变量 % 10 后直接放入C中

因为在前面我们是倒序输入的,这里我们顺序输入C,那么最后我们需要将倒序输出正确结果

为什么在函数参数那里需要使用&
因为这样子,C++就会只传递地址,而不传递真正的数据。
通过地址一样的可以达到访问数据的效果,实现更好的时间效率


http://www.kler.cn/a/4594.html

相关文章:

  • Android 调用系统服务接口获取屏幕投影(需要android.uid.system)
  • 2025年中科院分区大类划分公布!新增8155本
  • 接口测试Day09-数据库工具类封装
  • Require:利用MySQL binlog实现闪回操作
  • vue3+ts+element-plus 对话框el-dialog设置圆角
  • 【机器学习案列】学生抑郁可视化及预测分析
  • 使用Vue脚手架(CLI)创建Vue项目并分析项目结构
  • JAVA入门(开发环境和一些概念)
  • 华为OD机试题,用 Java 解【自动曝光】问题 | 含解题说明
  • 【git】将本地项目同步到远程
  • keepalived
  • 【华为OD机试 2023最新 】 新员工座位(C++)
  • 基于springboot+vue仓库管理系统(程序+数据库)
  • 【机器学习】03-转换器和预估器、K-近邻算法、朴素贝叶斯算法、决策树等算法知识
  • 超好用的浏览器兼容性测试工具,赶紧收藏!
  • JConsole使用教程
  • JSON 数据类型
  • 二叉树结构的实现
  • 全国首个、大势共建 | 实景三维领域部级工程技术创新中心正式挂牌运营
  • 2022蓝桥杯Java A组、B组
  • 数据结构与算法:堆和栈的区别概述
  • Vue+springboot 高校图书馆座位预约选座系统java毕业设计项目推荐
  • 阿里云-云存储OSS
  • celery详解
  • Leetcode.1574 删除最短的子数组使剩余数组有序
  • macOS 13.3 正式版(22E252)黑苹果恢复版镜像