王道机试练习——高精度大整数加法
题目描述
实现一个加法器,使其能够输出 a+b 的值。
输入: 输入包括两个数 a 和 b,其中 a 和 b 的位数不超过 1000 位。
输出: 可能有多组测试数据,对于每组数据,输出 a+b 的值。
代码
#include<iostream>
#include<string>
struct bigInteger {//高精度整数结构体
int digit[1000];//按四位数一个单位保存
int size;//下一个未使用的数组单元
void init() {//结构体初始化
for (int i = 0; i < 1000; i++) digit[i] = 0;//所有数位清零
size = 0;//下一个未使用的数组单元为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控制每4个字符转换为一个数字存入数组
//t临时保存字符串转换为数字的中间值
//c表示当前位的权重,按1,10,100,1000顺序变化
t += (str[i] - '0') * c;//计算这个四位数当前字符代表的数字,
//即数字乘以当前位权重
j++;//当前转换字符数增加
c *= 10;//计算下一位权重
if (j == 4 || i == 0) {//若已经连续转换四个字符,或者已经达到最后一个字符
digit[size++] = t;//将这四个字符代表的四位数存入数组,size移动到下一个数组单位
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,即当前数字不足4位时由0补充
//如110001的后四位数
else printf("%d", digit[i]);//若是最高位,则无需输出前导0
}
printf("\n");//换行
}
bigInteger operator +(const bigInteger& A)const {//加法运算符
bigInteger ret;//返回值,即两数相加结果
ret.init();
int carry = 0;//进位,初始值为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;
}