一、概述
高精度整数的意思即是数据范围极大,已经无法用unsigned long long存储的数据的运算。很多OJ中都有相关练习题(如a+b升级版等),而对于故意给出极大数据的题目此算法为常用算法。
本章仅研究对于10进制以内(2进制~10进制)数的加法。本章将使用例题的讲解方法。
二、例题
例题1
已知两个10进制数a,b,求a+b的值。
数据范围
对于a,b,50%的数据不大于10100。
输入输出
输入1
201647458466448 116476489143158
输出1
318123947609606
分析
对于这个数据范围,很明显要使用高精度运算方法。
高精度加法的流程如下。以本题示例为例。
(1)使用char[]存储两个大整数,并将其全部存入int[];
(2)用一个新的int[]存储做完加法的数,按位全部加起来;
(3)处理进位。
流程如下图所示。
实现
#include <cstdio>
#include <cstring>
char a1[105], b1[105];
int a[105], b[105], c[105];
int main(void) {
FILE *f = fopen("in.txt", "r");
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
fscanf(f, "%s%s", a1, b1);
fclose(f);
int alen = strlen(a1), blen = strlen(b1);
int i;
// 倒序放入数字
for(i = 0; i < alen; i++) a[alen - i] = a1[i] - '0';
for(i = 0; i < blen; i++) b[blen - i] = b1[i] -