[LeetCode] 989. 数组形式的整数加法

数组形式的整数加法

题目描述
对于非负整数 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.将得到的数组进行逆置

图解如下:
[LeetCode] 989. 数组形式的整数加法_第1张图片
代码实现

//逆置
 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;
}

你可能感兴趣的:(LeetCode,leetcode,算法,数据结构,c语言,数组)