一. 题目背景
在日常计算中,加减乘除是最常见不过的,放到计算机中,在unsigned long long类型范围内,可以通过高级程序设计语言编译,传给计算机硬件,进行计算,但操作数要是很大的话,大于unsigned long long的范围,就是高精度数与高精度数的操作了。
二. 高精加
初阶高精算法原理相当于小学学习的加减乘除,竖式加法乘法我们再熟悉不过了,例如123+789这个算式,用竖式写出来:
1 | 2 | 3 | |
+ | 7 | 8 | 9 |
和 | 8 | 10 | 12 |
进位 | 1 | 1 | |
= | 9 | 1 | 2 |
答案为912,我们一步一步拆分看,先算了每一位的和,留下 mod 10 的结果,下一位加一 / 10的结果,这也就是高精加算法的核心了。
三. 代码实现
初始录入数据
正常写数字是从高位开始,但我们的计算从个位开始,所以输入输出都是倒序的
首先输入接收的是两个字符串,定义变量
#define MAXN 100000010
char a[MAXN], b[MAXN];
int A[MAXN], B[MAXN];
int C[MAXN];
主函数中进行输入和倒序将 a[ ] 内字符转为 每一位数交给 A[ ].
scanf("%s", a);
scanf("%s", b);
int sa = strlen(a);
int sb = strlen(b);
int maxsize = Max(sa, sb);
for (int i = sa - 1, j = 0; i >= 0; j++, i--) A[j] = a[i] - '0';
for (int i = sb - 1, j = 0; i >= 0; j++, i--) B[j] = b[i] - '0';
加法函数代码:
void add(int A[],int sa, int B[],int sb,int C[]) {
int sizec = Max(sa, sb);
int t = 0;
for (int i = 0; i < sizec; i++) {
t += A[i] + B[i];
C[i] = t % 10;
t /= 10;
}
if (t) C[sizec] = t;
}
int Max(int a, int b) {
if (a > b) return a;
else return b;
}
注意当我们加至最后一位时,并没有把最后可能进位 t 放入答案数组,所以加上特判:
if (t) C[sizec] = t;
完整代码
#include<stdio.h>
#include<string.h>
void add(int A[], int sa, int B[], int sb, int C[]);
int Max(int a, int b);
#define MAXN 100000010
char a[MAXN], b[MAXN];
int A[MAXN], B[MAXN];
int C[MAXN];
int main(void) {
scanf("%s", a);
scanf("%s", b);
int sa = strlen(a);
int sb = strlen(b);
int maxsize = Max(sa, sb);
for (int i = sa - 1, j = 0; i >= 0; j++, i--) A[j] = a[i] - '0';
for (int i = sb - 1, j = 0; i >= 0; j++, i--) B[j] = b[i] - '0';
add(A, sa, B, sb, C);
if (C[maxsize]) printf("%d", C[maxsize]);
for (int i = maxsize - 1; i >= 0; i--) printf("%d", C[i]);
return 0;
}
void add(int A[],int sa, int B[],int sb,int C[]) {
int sizec = Max(sa, sb);
int t = 0;
for (int i = 0; i < sizec; i++) {
t += A[i] + B[i];
C[i] = t % 10;
t /= 10;
}
if (t) C[sizec] = t;
}
int Max(int a, int b) {
if (a > b) return a;
else return b;
}