LeetCode每日一练:数组形式的整数加法

2023-04-12 14:04:10 浏览数 (1)

链接: 数组形式的整数加法


思路:(C语言版本) 这道题的难点在于我们不知道两个数最高位是否还需要进位。。。。

但是我们可以确定的一个是最多只能向前进一位!为什么呢?大家想想,比如两个9相加,最高也只是18,只能向前进一位。

  1. 所以我们第一步先求出数组这个数字的长度k的长度,然后取长的那个,创建一个新数组newarr大小为长的那个数字的长度加一
  2. 第二步就是从个位开始,分别分解两个数,然后求和,并且判断是否有进制位,有的话存起来,给下一位相加时候加上去,以此循环,直到两个数都分解完成。
  3. 最后还要判断一下是否还存着一个进制位没有加上去,有的话就给newarr的最高位加一,然后将newarr反转过来(因为我们采取先尾插后反转的方式)。

代码:

代码语言:javascript复制
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* addToArrayForm(int* num, int numSize, int k, int* returnSize){
    int tmp = k;
    int ksize = 0;
    while(tmp)
    {
        ksize  ;
        tmp /= 10;
    }
    //求出两个长的那个
    int len = ksize > numSize ? ksize   1 : numSize   1;
    //然后创建一个len长度的新数组
    int* newarr = (int*)malloc(sizeof(int)*len);

    //从右往左k的每一位和数组里面的每一位相加
    int ki = 0;
    int ai = numSize - 1;
    int next = 0;//进位
    int sumi = 0;//用于赋给newarr的下标标志
    while(ki < ksize || ai >= 0)
    {
        //分解出num的每一位
        int aval = 0;
        if(ai >= 0)
        {
            aval = num[ai];
        }

        //分解出k的每一位
        int kval = 0;
        if(ki < ksize)
        {
            kval = k % 10;
            k /= 10;
        }

        int sum = kval   aval   next;
        //判断一下是否需要进位
        if(sum > 9)
        {
            sum -= 10;
            next = 1;
        }
        else 
        {
            next = 0;
        }

        //将sumi的数值赋给新数组newarr
        newarr[sumi  ] = sum;

        ai--;
        ki  ;
    }

    //判断是否还有进位
    if(next == 1)
        newarr[sumi  ] = 1;

    //最后逆置新数组newarr
    int begin = 0;
    int end = sumi - 1;
    while(begin < end)
    {
        int tmp = newarr[begin];
        newarr[begin] = newarr[end];
        newarr[end] = tmp;
          begin;
        --end;
    }

    //将长度以及数组返回
    *returnSize = sumi;
    return newarr;
}

0 人点赞