【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
|
12天前
辗转相除法
【10月更文挑战第21天】辗转相除法。
20 2
|
6月前
|
算法
辗转相除法求最大公约数
辗转相除法求最大公约数
|
6月前
|
人工智能 算法
DAY-1 | 迭乘法、辗转相除法、试除法:最大公约数与最小公倍数问题
这段内容是一个关于计算两个数的最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)的编程题目说明,包括题干、题解和方法总结。其中提到了两种方法:辗转相除法和试除法。辗转相除法通过不断用较大数除以较小数直到余数为零来求最大公约数,然后利用两数乘积除以最大公约数得到最小公倍数。试除法则是通过循环尝试两数的倍数是否同时能被两数整除来求解。在方法总结部分,还介绍了迭乘法求最小公倍数的方法。
72 0
|
6月前
辗转相除法求最大公约数(使用递归实现)~
辗转相除法求最大公约数(使用递归实现)~
|
Java C++
高精度加法 A+B 问题
高精度加法 A+B 问题
|
算法 搜索推荐 程序员
欧几里得算法
欧几里得算法(Euclidean algorithm)是一种计算两个数的最大公约数(Greatest Common Divisor,简称 GCD)的算法。欧几里得算法的基本思想是通过辗转相除的方式,将两个数逐步缩小,直到它们的公约数为止。欧几里得算法的时间复杂度为 O(log n)。
224 1
|
算法 Java
欧几里得算法(GCD, 辗转相除法)
欧几里得算法(GCD, 辗转相除法)
|
算法 C语言
C语言题解——最小公倍数的三种求法(含最大公约数)
最小公倍数是指能同时将两数整除的最小倍数,而最大公约数是则是能被两数同时整除的最小因数。最小公倍数有个特点,就是最小为两数中的较大值,最大为两数的乘积;最小公倍数则是最小为1,最大为两数中较小值(如果两数相同,那么最大公约数、最小公倍数是它们本身)🎉🎉🎉
309 1
C语言题解——最小公倍数的三种求法(含最大公约数)
辗转相除法 求最大公约数
辗转相除法 求最大公约数
815 0