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

数组形式的整数加法C语言❤_第1张图片

一、题目:

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

这样就大功告成了。 

三:完整代码

/**
 * 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

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

数组形式的整数加法C语言❤_第2张图片 

 

 

 

 

 

你可能感兴趣的:(c语言,算法,数据结构)