高精度加法(含代码)

发布时间 2023-05-26 21:37:34作者: Admin--002

高精度加法

例 1

例如: 1111111111111+9, 列成竖式,

   1 1 1 1 1 1 1 1 1 1 1 1 1
 +                         9
 
 ---------------------------
 

先算个位,

1+9=10,
10, 向十位进1

   1 1 1 1 1 1 1 1 1 1 1 1 1
 +                         9
                         1
 ---------------------------
                           0

接下来, 处理进位
十位: 1+1=2 -> 2

   1 1 1 1 1 1 1 1 1 1 1 1 1
 +                         9
                         1
 ---------------------------
                         2 0

百位: 无进位, 直接照抄. 1 -> 1

   1 1 1 1 1 1 1 1 1 1 1 1 1
 +                         9
                         1
 ---------------------------
                       1 2 0

千位: 1 -> 1

万位: ...

...: ...

最高位: 1 -> 1

最终结果:

   1 1 1 1 1 1 1 1 1 1 1 1 1
 +                         9
                         1
 ---------------------------
   1 1 1 1 1 1 1 1 1 1 1 2 0

所以, 1111111111111+9=1111111111120

例 2

1111111111111+8888888888889,
这个算式变成了高精度+高精度了。

还是列成竖式,

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
 
 ---------------------------
 

先算个位,

1+9=10,
10, 向十位进1

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
                         1
 ---------------------------
                           0

接下来, 算十位。

1+8+1=10,
10, 向百位进1

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
                       1 1
 ---------------------------
                         0 0

千位, 万位...以此类推。

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
                     1 1 1
 ---------------------------
                       0 0 0
   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
                   1 1 1 1
 ---------------------------
                     0 0 0 0

......

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
   1 1 1 1 1 1 1 1 1 1 1 1
 ---------------------------
     0 0 0 0 0 0 0 0 0 0 0 0

最高位:
1+8+1=10,
向前一位进1.

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
 1 1 1 1 1 1 1 1 1 1 1 1 1
 ---------------------------
   0 0 0 0 0 0 0 0 0 0 0 0 0
   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
 1 1 1 1 1 1 1 1 1 1 1 1 1
 ---------------------------
 1 0 0 0 0 0 0 0 0 0 0 0 0 0

所以,

1111111111111+8888888888889=10000000000000=1013

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
 1 1 1 1 1 1 1 1 1 1 1 1 1
 ---------------------------
 1 0 0 0 0 0 0 0 0 0 0 0 0 0

代码

  1. 首先导入头文件。
// 1. Import libraries
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cstring>
#include <cassert>
#include <vector>
// Import namespace 'std'
using namespace std;
  1. 初始化变量。
// 2. Initialize variables
const int MAX = 1000;
char s[MAX+1];
int a[MAX+1], b[MAX+1],c[MAX+2];
  1. 定义主函数main()
// 3. Define Main Function
int main(int argc, char **argv) {
    for (int i=0;i<1001;i++) {
        s[i]='0';
        a[i]=0, b[i]=0, c[i]=0;
    } // If you use global variables, this initialization does not need used.

这里如果使用全局变量,这个初始化可以不用。
4. 输入(包含了处理)变量

    // 4. Input and process variables
    scanf("%s",s+1);
    int lena = strlen(s+1);

    for (int i=1;i<=lena+1;i++)
        a[i] = s[lena-i+1] - '0';

    scanf("%s",s+1);
    int lenb = strlen(s+1);
    for (int i=1;i<=lenb+1;i++)
        b[i] = s[lenb-i+1] - '0';

    int lenc = (lena>lenb)?lena:lenb;
  1. 真正的高精度计算到这里才开始。计算代码
    // 5. Calculate
    for (int i=1;i<=101;i++)
        c[i] = 0;
    for (int i=1;i<=lenc;i++) {
        // c[i] = a[i] + b[i]; <-- Wrong! 
        c[i] = a[i] + b[i] + c[i]; // <-- Correct
        // c[i] += a[i] + b[i]; <-- Plan B, Correct too
        // 处理进位
        c[i+1] = c[i] / 10;
        c[i] = c[i] % 10;
    }
    // 处理 overflow
    if (c[lenc+1]>0)
        lenc++;
  1. 输出
    // 6. Output
    for (int i=lenc;i>=1;i--)
        printf("%d", c[i]);
    return 0;
}

附: 完整代码

// 1. Import libraries
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cstring>
#include <cassert>
#include <vector>
// Import namespace 'std'
using namespace std;

// 2. Initialize variables
const int MAX = 1000;
char s[MAX+1];
int a[MAX+1], b[MAX+1],c[MAX+2];


// 3. Define Main Function
int main(int argc, char **argv) {
    for (int i=0;i<1001;i++) {
        s[i]='0';
        a[i]=0, b[i]=0, c[i]=0;
    } // If you use global variables, this initialization does not need used.
	
    // 4. Input and process variables
    scanf("%s",s+1);
    int lena = strlen(s+1);

    for (int i=1;i<=lena+1;i++)
        a[i] = s[lena-i+1] - '0';

    scanf("%s",s+1);
    int lenb = strlen(s+1);
    for (int i=1;i<=lenb+1;i++)
        b[i] = s[lenb-i+1] - '0';

    int lenc = (lena>lenb)?lena:lenb;

    // 5. Calculate
    for (int i=1;i<=101;i++)
        c[i] = 0;
    for (int i=1;i<=lenc;i++) {
        // c[i] = a[i] + b[i]; <-- Wrong! 
        c[i] = a[i] + b[i] + c[i]; // <-- Correct
        // c[i] += a[i] + b[i]; <-- Plan B, Correct too
        // 处理进位
        c[i+1] = c[i] / 10;
        c[i] = c[i] % 10;
    }
    // 处理 overflow
    if (c[lenc+1]>0)
        lenc++;

    // 6. Output
    for (int i=lenc;i>=1;i--)
    printf("%d", c[i]);
    return 0;
}
复制之前看我一下 `Control`, 缩写为Ctrl, 扩写为唱,跳,rap,篮球。 你还敢Ctrl+C吗?

[========]

[========]

[========]

[========]