数组形式的整数加法
题目描述
对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。
给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。
示例1
输入:A = [1,2,0,0], K = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234
示例2
输入:A = [2,1,5], K = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021
使用语言: C语言
思路解析:
1.先对数组的大小和整数的位数进行比较,比较出大的一个 +1 为开辟空间的大小,+1是防止两数相加高位进位
2.取出数组的每一个元素和整数的每一位,进行对应位相加并放入开辟的新空间中(注意每一位是否有进位),从空间下标为0的位置开始从前往后放(如果从后往前放,相加之后位数不确定不知道从第几个位置开始放)
3.判断最高位两数相加是否右进位,若有进位需在下一位放1,完成后检测输出元素的个数
4.将得到的数组进行逆置
图解如下:
代码实现
//逆置
void Reverse(int* retArr,int left,int right)
{
while(left < right)
{
int tem = retArr[left];
retArr[left] = retArr[right];
retArr[right] = tem;
++left;
--right;
}
}
int* addToArrayForm(int* A, int ASize, int K, int* returnSize)
{
//求k的位数
int num = K;
int ksize = 0;
while(num)
{
++ksize;
num /= 10;
}
//比较A和k哪个大
int n = ASize > ksize ? ASize + 1 : ksize + 1;
//开辟大的位数+1个空间
int* retArr = malloc(sizeof(int) * n);
int Ai = ASize - 1;
int next = 0; //进位
int reti = 0; //最终逆置前数组的下标
while(Ai >= 0 || K > 0)
{
//取出要加的K中的数
int Knum = K % 10;
K /= 10;\
//解决A先结束问题
int Anum = 0;
//取出A中要加的数
if(Ai >= 0)
{
Anum = A[Ai];
--Ai;
}
int ret = Anum + Knum + next;
//判断是否进位
if(ret >= 10)
{
next = 1;
ret -= 10;
}
else
{
next = 0;
}
retArr[reti] = ret;
++reti;
}
//如果最后一位进位,直接让下一位等于1
if(next == 1)
{
retArr[reti] = 1;
++reti;
}
//输出元素的个数
*returnSize = reti;
//逆置
Reverse(retArr , 0 , reti - 1);
return retArr;
}