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

2023-12-29 16:44:51

一、题目:

整数的?数组形式???是按照从左到右的顺序表示其数字的数组。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;
}

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

?

?

?

?

?

?

文章来源:https://blog.csdn.net/2302_79282659/article/details/135291976
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。