高精度加法(含代码)

Posted C++

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度加法(含代码)相关的知识,希望对你有一定的参考价值。

高精度加法(含代码)

高精度加法

例 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吗?

[========]

[========]

[========]

[========]

高精度小数加法

例题链接:hdu1753    http://acm.hdu.edu.cn/showproblem.php?pid=1753

代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn = 500;
char a[maxn];
char b[maxn];

int aa1[maxn];
int aa2[maxn];
int bb1[maxn];
int bb2[maxn];
int ansx[maxn];
int ansz[maxn];
int main()
{

    while(~scanf("%s%s",&a,&b))
    {

        memset(aa1 , 0 , sizeof(aa1));
        memset(aa2 , 0 , sizeof(aa2));
        memset(bb1 , 0 , sizeof(bb1));
        memset(bb2 , 0 , sizeof(bb2));
        memset(ansx , 0 ,sizeof(ansx));//小数的答案数组
        memset(ansz , 0 ,sizeof(ansz));//整数的答案数组

        int lena, lenb;
        int i,j;
        ///处理串a
        int ta = lena = strlen(a);
        for(i = 0; i < lena ; i++)
        {
            if(a[i] == .)
            {
                ta = i;
                break;
            }
        }
        ///整数逆存存放, 比如 1 2 3 存为 3 2 1
        for(i = ta - 1; i >= 0; i--)
        {
            aa1[ta - i - 1] = a[i] - 0;
        }

        ///小数正序存放 ,比如 4 5 6 存为 4 5 6

        j = 0;
        for(i = ta + 1; i < lena ; i++)
        {
            aa2[j++] = a[i] - 0;
        }

        ///处理串b
        int tb = lenb = strlen(b);
        for(i = 0; i < lenb ; i++)
        {
            if(b[i] == .)
            {
                tb = i;
                break;
            }
        }
        ///整数逆存存放, 比如 1 2 3 存为 3 2 1
        for(i = tb - 1; i >= 0; i--)
        {
            bb1[tb - i - 1] = b[i] - 0;
        }

        ///小数正序存放 ,比如 4 5 6 存为 4 5 6
        j = 0;
        for(i = tb + 1; i < lenb ; i++)
        {
            bb2[j++] = b[i] - 0;
        }


        ///ADD

        ///小数
        int lenaa2 = lena - ta;
        int lenbb2 = lenb - tb;

        int lenx = lenaa2 > lenbb2 ? lenaa2 : lenbb2;
        int jinwei = 0;
        for(i = lenx - 1; i >= 0 ; i--)
        {
            ansx[i] = (aa2[i] + bb2[i] + jinwei)%10;
            jinwei  = (aa2[i] + bb2[i] + jinwei)/10;
        }

        int lenz = ta > tb ? ta : tb;

        for(i = 0; i <= lenz ; i++)
        {
            ansz[i] = (aa1[i] + bb1[i] + jinwei)%10;
            jinwei  = (aa1[i] + bb1[i] + jinwei)/10;
        }

        if(ansz[lenz] > 0)
            lenz++;
        for(i = lenz - 1; i >= 0; i--)
        {
            printf("%d",ansz[i]);
        }

        while(ansx[lenx - 1] == 0)
        {
            if(ansx[lenx - 1] == 0)
            {
                lenx--;
            }
        }

        if(lenx > 0)
            printf(".");

        for(i = 0; i < lenx ; i++)
        {
            printf("%d",ansx[i]);
        }
        printf("\n");
    }
    return 0;
}

 

以上是关于高精度加法(含代码)的主要内容,如果未能解决你的问题,请参考以下文章

高精度加法

高精度1--加法

高精度小数加法

算法AcWing 791. 高精度加法

一本通1168 高精度加法

高精度 加法 减法 乘法 除法 整合