题目描述:
整数的数组形式 num 是按照从左到右的顺序表示其数字的数组。
例如,对于 num = 1321,数组形式是 [1,3,2,1] 。
给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式
示例 :
输入:num = [1,2,0,0], k = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234
int* addToArrayForm(int* num, int numSize, int k, int* returnSize){
//求出整数k的长度
int kSize = 0;//记录数k的长度
int kNum = k;//把k的值存起来
while(kNum>0)
{
kSize++;
kNum /=10;
}
//取数组和整数k两者中长度最大的一方
int len = numSize > kSize?numSize:kSize;
//创建一段数组空间,由于两个数相加,和最多会进一位
int* retArr = (int*)malloc(sizeof(int)*(len+1));
//定义一个变量,记录原始数组的下标
int Ai = numSize-1;
//进位
int carry = 0;
//记录新创数组的下标
int reti = 0;
while(len--)
{
//这里需要考虑如果数组的长度没有整数k长,那么短下的一部分需要用0来代替
int a = 0;
if(Ai>=0)
{
a = num[Ai];
Ai--;
}
//定义一个变量,来存放每一位相加以及进位的和
int number = a+k%10 + carry;
//每次整除10,相当于去除已经加过的剩余部分
k = k/10;
//如果number大于9,说明有进位,此时number最少也是10
if(number > 9)
{
number -=10;
carry = 1;
}
else
{
carry = 0;
}
//将已经处理好的数据添加到创建好的数组中,将个位存到开头,依此往后存
retArr[reti] = number;
reti++;
}
//注意:如果最后一位有进位但循环已经结束,这时要进行再次判断,并加入进位
if(carry == 1)
{
retArr[reti] = 1;
reti++;
}
//因为是正方向存储数据,所以新创的数组中的数是倒的,所以要反转数组
int left = 0,right = reti-1;
while(left<right)
{
int temp = retArr[left];
retArr[left] = retArr[right];
retArr[right] = temp;
left++;
right--;
}
*returnSize = reti;
return retArr;
}