【4. 高精度加法】

简介: 高精度加法>## 思路:>- 大整数存储(用数组来存储,数组第0位,存低位,数组最后一位存高位),因为在进行加法运算时,通常会有进位,而在数组的最后一位,进位比较容易,而如果在数组开头进位的话,需要把整个数组移动一位。>- 数组的每一位存一位数字

# 高精度加法

思路:

  • 大整数存储(用数组来存储,数组第0位,存低位,数组最后一位存高位),因为在进行加法运算时,通常会有进位,而在数组的最后一位,进位比较容易,而如果在数组开头进位的话,需要把整个数组移动一位。
  • 数组的每一位存一位数字

步骤

  1. 因为输入的数大于longlong了,所以就用string存放;
  2. 将string里存的数逆序存入数组,这样模拟手工从右往左计算过程。
  3. 循环(长的那个数组有多少个数,就循环多少次),两数相加,如果数>10,那就保留各位,十位加到下一个数中。
  4. 因为数逆序存入所以要逆序输出。

举例

计算 12696 + 6666 = 22362
1661149360664.png

代码

#include <iostream>
using namespace std;

#include <vector>

const int N = 1e6 + 10;

                                                         //C = A + B;
vector<int> add (vector<int> &A, vector<int> &B)         //传引用就是为了防止拷贝,减少空间的浪费
{
    vector<int> C;
    int t = 0;                                           //进位
    for (int i = 0; i < A.size() || i < B.size(); i ++)
    {
        if (i < A.size())  t += A[i];
        if (i < B.size())  t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }
    
    if (t) C.push_back(1);
    return C;
}

 int main()
 {
     string a, b;                                        //因为数字位数比较多,用字符串进行存储
     vector<int> A, B;
     
     cin >> a >> b;                                      //a = '123456789';
     for (int i = a.size()- 1; i >= 0; i --) A.push_back(a[i] - '0'); // A = [9, 8, 7, 6, 5, 4, 3, 2, 1]
     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--) printf("%d", C[i]);
     return 0;
     
 }
// 中间可以写成下面这种方式
vector<int> add (vector<int> &A, vector<int> &B)   //传引用就是为了防止拷贝,减少空间的浪费
{
   vector<int> C;
   int t = 0;    //进位
   
   if (A.size() < B.size()) return add(B, A)    //保证A始终是长度最长的那个
       
   for (int i = 0; i < A.size() ; i ++)
   {
       t += A[i];                              //此时无须在判断A的长度,因为A是最长的需要一直加
       if (i < B.size())  t += B[i];
       C.push_back(t % 10);
       t /= 10;
   }
   
   if (t) C.push_back(1);
   return C;
}
目录
相关文章
|
NoSQL 安全 Go
Golang 官方推荐使用的 Redis 客户端 redigo
Golang 官方推荐使用的 Redis 客户端 redigo
569 0
|
8月前
|
人工智能 自然语言处理 搜索推荐
携多项成果亮相云栖大会,探索大模型在云通信中的创新应用与全球实践
2025云栖大会云通信分论坛聚焦大模型与云通信融合,阿里云发布智能联络中心2.0与Chat App AI助理,携手伙伴推动通信智能化升级。
645 1
|
12月前
|
网络协议 物联网 网络安全
IPv6地址
IPv6是互联网协议第六版,旨在替代IPv4以解决地址枯竭问题。它采用128位地址,提供近乎无限的地址数量,支持物联网等新兴领域发展。相比IPv4,IPv6具备更多优势:地址数量充足、安全性更高(内置IPsec)、性能更优(简化数据包头部结构)以及支持即插即用功能(自动配置地址)。尽管当前IPv4仍占主流,但随着技术进步和设备互联需求增长,IPv6的应用前景将更加广阔。
1356 10
|
9月前
|
Ubuntu 安全 Linux
Ubuntu 20.04 LTS,更安全、易用和高效
总之,Ubuntu 20.04 LTS版本是一个值得升级和尝试的版本,最广泛的衍生版本对广大用户提供了最大程度的选择。快速的GNOME桌面的,完善的主题和设计,安全性改进也使Ubuntu 20.04值得进行更新。
560 0
|
缓存 easyexcel Java
狂神说POI,EasyExcel笔记及源码资料(一)
狂神说POI,EasyExcel笔记及源码资料(一)
1285 0
狂神说POI,EasyExcel笔记及源码资料(一)
WK
|
C++ 开发者
QDialog
QDialog是Qt框架中的对话框基类,支持模态和非模态两种模式。它提供了丰富的函数,如exec()、show()、accept()和reject(),用于控制对话框的行为。QDialog可以包含多种控件,用于收集用户输入或显示信息。此外,Qt还提供了一些常用的标准化对话框,如QColorDialog、QFileDialog、QFontDialog、QInputDialog和QMessageBox,方便开发者快速实现特定功能。
WK
518 2
|
机器学习/深度学习 分布式计算 算法
PySpark如何处理非结构化数据?
【6月更文挑战第15天】PySpark如何处理非结构化数据?
412 5
|
Java 编译器 Go
QT软件开发:基于libVLC内核设计视频播放器
QT软件开发:基于libVLC内核设计视频播放器
1402 0
QT软件开发:基于libVLC内核设计视频播放器
|
前端开发 搜索推荐 JavaScript
如何成功完成一个Java项目答辩
如何成功完成一个Java项目答辩
527 1
|
XML Java 测试技术
《手把手教你》系列基础篇(八十二)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-上篇(详解教程)
【6月更文挑战第23天】TestNG 是一个用于自动化测试的 Java 框架,它自动生成测试报告,包括 HTML 和 XML 格式。报告可在 `test-output` 文件夹中找到。要创建测试用例,可创建一个实现了 `@Test` 注解的方法。通过 `testng.xml` 配置文件来组织和执行测试。默认报告包括测试结果、失败点和原因。用户还能实现 `ITestListener` 和 `IReporter` 接口来自定义报告和记录器。
340 2

热门文章

最新文章