高精度加法是信息学的一种重要算法。这种算法使用多个存储单位进行计算,因此它的计算范围超过一般使用一个存储单位的算法。也是一些信息学竞赛的常考题目。

c/c++最大也就是unsigned long long也就才(1019+8×1018)(10^{19}+8\times 10^{18})

如果要几百位的相加减就不行了,所以就要用高精度了,但高精度是什么呢,一句话,就是处理很大的数相加减之类就比如几百位的数相加,就是很大的数。

高精度加法,其实就是竖式加法啦。

文字描述

也就是从最低位开始,将两个加数对应位置上的数码相加,并判断是否达到或超过 。如果达到,那么处理进位:将更高一位的结果上增加1,当前位的结果减少10

最终算法:

(算法不懂的请看注释)

void add(int a[], int b[], int c[]) {
  clear(c);

  // 高精度实现中,一般令数组的最大长度 LEN 比可能的输入大一些
  // 然后略去末尾的几次循环,这样一来可以省去不少边界情况的处理
  // 因为实际输入不会超过 1000 位,故在此循环到 LEN - 1 = 1003 已经足够
  for (int i = 0; i < LEN - 1; ++i) {
    // 将相应位上的数码相加
    c[i] += a[i] + b[i];
    if (c[i] >= 10) {
      // 进位
      c[i + 1] += 1;
      c[i] -= 10;
    }
  }
}

算法都教了,怎能不上食用方法呢?

(食用方法注释由wangqihangwangqihang提供)

食用方法:

#include<iostream>
#include<string>
using namespace std;

const int N = 510;
int a[N], b[N], c[N];
int main()
{
    string str1;
    string str2;
    cin >> str1;//输出
    cin >> str2;//输出
    for (int i = 0; i < str1.size(); i ++)
        a[str1.size()-1 - i] = str1[i] - '0';//转换为int
    for (int i = 0; i < str2.size(); i ++)
        b[str2.size()-1 - i] = str2[i] - '0';//转换为int
    int ans = max(str1.size(), str2.size());
    for (int i = 0; i < ans; i ++){
        c[i] += a[i] + b[i];
        c[i+1] = c[i] / 10;//进位
        c[i] %= 10;
    }
    ans += 1;
    if (c[ans-1] == 0 && ans > 1)
        ans -= 1;
    for (int i = 0; i < ans; i ++)//输出
        cout << c[ans-1-i];
    return 0;
}

0 条评论

目前还没有评论...