题目描述:
实现一个加法器,使其能够输出a+b的值。
输入:
输入包括两个数a和b,其中a和b的位数不超过1000位。
输出:
可能有多组测试数据,对于每组数据,
输出a+b的值。
样例输入:
2 6
10000000000000000000 10000000000000000000000000000000
样例输出:
8
10000000000010000000000000000000
解题思路
由于该题输入非常巨大,不能使用任何整数类型来直接保存,因此采取高精度整数结构体,以4位为一个单位进行保存,按照从低位开始各对应位相加并加上来自低位的进位从而获取本位的数值以及进位的规则进行运算,具体代码如下:
#include<stdio.h>
#include<string.h>
struct bigInteger { //高精度整数结构体
int digit[1000]; //按四位数一个单位保存数值
int size;
void init() {
for (int i = 0; i < 1000; i++)
digit[i] = 0;
size = 0;
}
void set(char str[]) { //从字符串中提取整数
init();
int L = strlen(str);
for (int i = L - 1, j = 0, t = 0, c = 1; i >= 0; i--) {
//从最后一个字符开始倒序遍历字符串,j控制每四个字符转化为一个数字存入数组
//t临时保存字符转换为数字的中间值,c表示当前位的权重,按1,10,100,1000顺序变化
t += (str[i] - '0')*c;
j++;
c *= 10;
if (j == 4 || i == 0) { //若已连续转化四个字符,或者已经到达最后一个字符
digit[size++] = t;
j = 0;
t = 0;
c = 1;
}
}
}
void output() { //将该高精度整数输出
for (int i = size - 1; i >= 0; i--) {
if (i != size - 1)
printf("%04d", digit[i]);
//若当前输出的数字不是最高位数字,用%04的输出前导0
else printf("%d", digit[i]);
//若是最高位无需输出前导0
}
printf("\n");
}
bigInteger operator + (const bigInteger &A) const { //加法运算符重载
bigInteger ret;
ret.init();
int carry = 0; //初始化进位
for (int i = 0; i < A.size || i < size; i++) {
int tmp = A.digit[i] + digit[i] + carry;
//计算两个整数当前位以及来自低位的进位和
carry = tmp / 10000; //计算进位
tmp %= 10000; //去除进位部分,取后四位
ret.digit[ret.size++] = tmp;
}
if (carry != 0)
ret.digit[ret.size++] = carry;
return ret;
}
}a,b,c;
char str1[1002], str2[1002];
int main() {
while (scanf("%s%s", str1, str2) != EOF) {
a.set(str1);
b.set(str2);
c = a + b;
c.output();
}
return 0;
}