数组形式的整数加法C语言❤

一、题目:

整数的 数组形式   是按照从左到右的顺序表示其数字的数组。num

  • 例如,对于 ,数组形式是 。num = 1321[1,3,2,1]

给定 ,整数的 数组形式 ,和整数 ,返回 整数 num + k 的 数组形式 。numk

示例 1:

输入:num = [1,2,0,0], k = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目链接

二:解题思路

这道题的思路比较简单

第一步:

对于num和k的位数进行比较,防止栈溢出的情况。在题目中,num的数组中元素的个数已经给出,那么自然它的位数就知道了,我们就只对k的位数进行计算。

 int numsizek=0;
    int knum=k;这里可以防止对k进行改变。用kunm来替代它。
    while(knum)
    {
        knum/=10;
        numsizek++;     这里的循环可以计算出位数的多少,如果想不明白的话可以带入相关的数来理解
    }
    int let=numSize>numsizek ? numSize:numsizek;这个就可以把相对大的值给let
    int *retArr=(int*)malloc(sizeof(int)*(let+1));  例如999+11它的位数就有可能比最大的那个大, 
                                                     最多大一位所以我们开辟空间时,就要多开辟一 
                                                                  个。

第二步

就是相加起来。

我们可以一位一位的加,个位加个位,十位加十位,百位加百位等等

    int Ai=numSize-1; 这个是num数组的最后一个元素。
    int reti=0;       这个是我们自己开辟空间的数组元素下标。
    int numDigit=0;   这个是如果位数相加大于10后它变成一,来加到下一位上。
    while(let--)      这个可以循环最大位数。
    {   int a=0;
        if(Ai>=0)
        {
            a=num[Ai];    这个1就是为了防止num中元素的个数小于k的位数的判断。
            Ai--;         即使不成立了,下面的a=0也毫无影响。
        }
        int ret=a+k%10+numDigit;  k%10是找到它的最后一位数。
        k/=10;                    依次去掉后面的数,来找k每个位置上的数。
        if(ret>9)
        {
            ret-=10;         这个判断作用是相应的位数是否大于10,大于10就要进一位,然后本位还要
            numDigit=1;      减10;
        }
        else
        numDigit=0;
        retArr[reti]=ret;
        reti++;
    }
    if(numDigit==1)
    {
        retArr[reti]=1;       因为当numDigit为1时需要返回才能加,所以当最后一位数相加时,如果 
                              超过了本位数,则无法加到下一位,所以我们需要在后面再下一个判断条 
                              件,来确定需不需要进一位
        ++ reti;
    }

第三步 :

我们所写的代码是反着的

例如:110+990=1100,我们需要的是1100

但是我们的代码是0011

所以我们需要将这个数组给倒转过来。

 int left=0;
    int right=reti-1;

    while(left<right)
    {
        int rum=0;
        rum=retArr[left];
        retArr[left]=retArr[right];
        retArr[right]=rum;
        left++;
        right--;
    }

这样就大功告成了。 

三:完整代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* addToArrayForm(int* num, int numSize, int k, int* returnSize) {
    int numsizek=0;
    int knum=k;
    while(knum)
    {
        knum/=10;
        numsizek++;
    }
    int let=numSize>numsizek ? numSize:numsizek;
    int *retArr=(int*)malloc(sizeof(int)*(let+1));
    int Ai=numSize-1;
    int reti=0;
    int numDigit=0;
    while(let--)
    {   int a=0;
        if(Ai>=0)
        {
            a=num[Ai];
            Ai--;
        }
        int ret=a+k%10+numDigit;
        k/=10;
        if(ret>9)
        {
            ret-=10;
            numDigit=1;
        }
        else
        numDigit=0;
        retArr[reti]=ret;
        reti++;
    }
    if(numDigit==1)
    {
        retArr[reti]=1;
        ++ reti;
    }
    int left=0;
    int right=reti-1;

    while(left<right)
    {
        int rum=0;
        rum=retArr[left];
        retArr[left]=retArr[right];
        retArr[right]=rum;
        left++;
        right--;
    }
    *returnSize=reti;
    return retArr;
}

虽然思路很简单,但是比较考察同学们的细心程度,是一道很经典的题,希望看官们能有所收获!

 

 

 

 

 

 

  • 40
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大鹏蓄力中

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

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

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

打赏作者

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

抵扣说明:

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

余额充值