刷题 | 计算任意长度整数之和
问题:
试设计一种表示任意长的整数(非负)的数据结构,计算任意给定的两个整数之和的算法。
算法思路:
- 利用数组(顺序表)对整数进行存储,数组中的每一个元素存放一个数字,数组A和B分别存储两个整数;
- 执行整数相加操作:
- A和B低位对齐;
- 从低位到高位对应位相加,和为cur_sum,将cur_sum%10存储到当前位,将cur_sum/10存储到高位;
- 处理最高位,若最高位求和结果产生进位,需要将结果的所有元素均后移一位。
代码实现:
SeqList* add_op(SeqList *LA, SeqList *LB){
/*
1.LA和LB末尾对齐;
2.逐元素相加;
3.判断首位是否产生进位,若进位则需要先将各位后移一位.
*/
//1.LA和LB末尾对齐;
SeqList *Long, *Short;
int margin, i, cur_sum;
if(LA->length > LB->length){
Long = LA;
Short = LB;
}else{
Long = LB;
Short = LA;
}
margin = Long->length - Short->length;
for(i=Short->length-1;i>=0;i--){
Short->list[i+margin] = Short->list[i];
}
//2.逐元素相加;
for(i=Long->length-1;i>0;i--){
int l = Long->list[i];
int s = Short->list[i];
cur_sum = Long->list[i] + Short->list[i];
Long->list[i] = cur_sum % 10;
Long->list[i-1] += cur_sum / 10;
}
//3.判断首位是否产生进位.
cur_sum = Long->list[0] + Short->list[0];
if(cur_sum / 10 == 0){
Long->list[0] = cur_sum % 10;
}else{
for(i=Long->length-1;i>0;i--){
Long->list[i+1] = Long->list[i];
}
Long->list[1] = cur_sum % 10;
Long->list[0] = cur_sum / 10;
Long->length += 1;
}
return Long;
}
运行截图: