数组形式的整数加法

Posted aaaaaaaWoLan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组形式的整数加法相关的知识,希望对你有一定的参考价值。

989. 数组形式的整数加法

对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。

给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。

思路(本人的菜鸡思路): 计算出k的位数大小ksize,开辟一个数组retarr,大小为numSizeksize中的较大值加1,加1是考虑进位的情况。随后对每位进行相加,将结果返回。

如何实现每一位的相加呢?我们从k的末位及数组的末尾开始相加,但要将结果%10,因为怕有进位的情况,然后设置进位next为1,否则就将进位设置为0。将加出来的每一位都按从前到后的顺序放到retarr中,这样的结果是反的,所以最后我们要将数组逆置一下。

有三种情况需要讨论一下:

  1. 数组和k相加完成后且数组中无剩余数、k无高位剩余,可能还有进位没有处理,所以循环结束时需要判断next是否为1,如果为1就将1加到retarr中。
  2. 当数组或k加完后,还有高位没有进行相加,也就是两者的位数不一致,导致有高位数字还没有完成相加
    • 当数组中还有数字时,再用循环将其余的位一位一位地加到retarr
    • 当k还有高位存在时,也用循环将高位一位一位地加到retarr
  3. 当前两种情况同时出现时,我们就不能简单地用循环来将数组中剩余的数字或k中的高位一位一位地加到retarr中了,还要加上next。当然,也有可能最后一次相加存在进位,所以最后还需要再次进行判断next是否为1,再决定最后一位要不要放入next

以A=[9,9,9],k=1为例:

第一步:一开始A中的最后一个9与 k % 10及next(一开始为0)相加,得10,需要进位,设置next = 1,并将相加的结果%10放入retarr中。同时numSize 减1,ksize减1

处理后:

第二步:ksize已经为0了,但A中还有数字,所以我们要继续进行相加。

A中的第二个9与next相加,得10,需要进位,next继续为1,将相加的结果%10放入retarr中,同时numSzie减1

第三步:与第二步相似,A中的第一个9与next相加,得10,需要进位,next继续为1,将相加的结果%10放入retarr中,同时numSzie减1

第四步:此时numSize已经为0了,所以要结束循环。

但还要注意,next此时还为0,所以循环结束后还要将next放入retarr中。

最后将retarr逆置一下就得到了结果。

代码:

int* addToArrayForm(int* num, int numSize, int k, int* returnSize){
    int number = k;
    int ksize = 0;
    int next = 0;//进位

    while (number)//计算k得位数
    {
        ksize++; 	
        number /= 10;
    }

    int asize = numSize > ksize ? numSize + 1 : ksize + 1;//原数组长度+1
    int* retarr = calloc(asize, sizeof(int));//指向返回数组
    int retSize = 0;//临时数组下标


    while (numSize > 0 && ksize > 0)//数组和k相加
    {
        retarr[retSize++] = (num[numSize - 1] + (k % 10) + next) % 10;
        if ((num[numSize - 1] + (k % 10) + next) >= 10)
        {
            next = 1;
        }
        else
        {
            next = 0;
        }
        k /= 10;
        ksize--;
        numSize--;
    }

    if (next == 1 && numSize <= 0 && ksize <= 0)//当最后得相加进位了且数组无剩余数字、k没有高位保留时,将next再加到retarr中
    {
        retarr[retSize++] = next;
        next = 0;
    }
    else//当数组有剩余数字或k有高位保留时
    {
        while (numSize > 0)//数组中还有剩余数字
        {
            retarr[retSize++] = (num[numSize - 1] + next) % 10;

            if ((num[numSize - 1] + next) >= 10)
            next = 1;
            else
            next = 0;

            numSize--;

        }
        while(ksize > 0)//k还有高位保留
        {
            retarr[retSize++] = (k % 10 + next) % 10;

            if (k % 10 + next >= 10)
            next = 1;
            else
            next = 0;

            k /= 10;
            ksize--;
        }
    }
    
    //循环结束后再判断是否有进位
    if (next == 1)
    {
        retarr[retSize++] = 1;
    }
    
    *returnSize = retSize;

    //逆置数组
    int left = 0;
    int right = retSize - 1;
    while (left <= right)
    {
        int tmp = retarr[left];
        retarr[left] = retarr[right];
        retarr[right] = tmp;
        left++;
        right--;
    }

    return retarr;
}

以上是关于数组形式的整数加法的主要内容,如果未能解决你的问题,请参考以下文章

数组形式的整数加法

数组形式的整数加法

3612数组形式的整数加法

3612数组形式的整数加法

LeetCode刷题989-简单-数组形式的整数加法

LeetCode刷题989-简单-数组形式的整数加法