【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;
}
目录
相关文章
|
Java C++
poj 1503 高精度加法
把输入的数加起来,输入0表示结束。 先看我Java代码,用BigINteger类很多东西都不需要考虑,比如前导0什么的,很方便。不过java效率低点,平均用时600ms,C/C++可以0ms过。
43 1
筛质数、分解质因数和快速幂的应用
筛质数、分解质因数和快速幂的应用
62 0
|
6月前
|
人工智能 Java BI
快速幂讲解
快速幂讲解
45 0
|
Java C++
高精度加法 A+B 问题
高精度加法 A+B 问题
|
存储
每日一题(两数相加)
每日一题(两数相加)
|
物联网
快速幂
快速幂
81 0
|
Java Python
leetcode每日一题.445:两数相加II
leetcode每日一题.445:两数相加II
84 0
|
人工智能