【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;
}
目录
相关文章
|
5月前
|
C++
筛质数、分解质因数和快速幂的应用
筛质数、分解质因数和快速幂的应用
45 0
|
15天前
PTA-第4章-11 判断素数
```markdown 程序需处理不超过10个正整数,每个数不大于1000000。对于每个数,若为素数则输出&quot;Yes&quot;,否则输出&quot;No&quot;。 输入示例: ``` 2 11 111 ``` 输出示例: ``` Yes No ```
23 8
|
3月前
辗转相除法求最大公约数(使用递归实现)~
辗转相除法求最大公约数(使用递归实现)~
|
3月前
|
人工智能 Java BI
快速幂讲解
快速幂讲解
22 0
|
7月前
|
Java C++
高精度加法 A+B 问题
高精度加法 A+B 问题
|
7月前
辗转相除法求最大公约数
假设 a / b =c …… d 欧几里得算法:被除数与除数的公约数和除数与余数的公约数相同,那么它们的最大公约数也相同 即:a 和 b 的最大公约数与 b 和 d 的最大公约数相同
28 0
|
8月前
|
算法 Java
欧几里得算法(GCD, 辗转相除法)
欧几里得算法(GCD, 辗转相除法)
|
9月前
快速幂问题
快速幂问题
|
9月前
|
物联网
快速幂
快速幂
57 0
|
算法 C语言
C语言题解——最小公倍数的三种求法(含最大公约数)
最小公倍数是指能同时将两数整除的最小倍数,而最大公约数是则是能被两数同时整除的最小因数。最小公倍数有个特点,就是最小为两数中的较大值,最大为两数的乘积;最小公倍数则是最小为1,最大为两数中较小值(如果两数相同,那么最大公约数、最小公倍数是它们本身)🎉🎉🎉
243 1
C语言题解——最小公倍数的三种求法(含最大公约数)