数组形式的整数加法

989. 数组形式的整数加法

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

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

image-20210830185121552

image-20210830185129365

image-20210830185139149

image-20210830185146589

思路(本人的菜鸡思路): 计算出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

image-20210830191403524

处理后:

image-20210830191804801

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

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

image-20210830191842329

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

image-20210830191942328

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

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

image-20210830192116185

最后将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;
}
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WoLannnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值