数组形式的整数加法
Posted aaaaaaaWoLan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组形式的整数加法相关的知识,希望对你有一定的参考价值。
989. 数组形式的整数加法
对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。
给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。
思路(本人的菜鸡思路): 计算出k的位数大小ksize
,开辟一个数组retarr
,大小为numSize
和ksize
中的较大值加1,加1是考虑进位的情况。随后对每位进行相加,将结果返回。
如何实现每一位的相加呢?我们从k的末位及数组的末尾开始相加,但要将结果%10,因为怕有进位的情况,然后设置进位next
为1,否则就将进位设置为0。将加出来的每一位都按从前到后的顺序放到retarr
中,这样的结果是反的,所以最后我们要将数组逆置一下。
有三种情况需要讨论一下:
- 数组和k相加完成后且数组中无剩余数、k无高位剩余,可能还有进位没有处理,所以循环结束时需要判断next是否为1,如果为1就将1加到
retarr
中。 - 当数组或k加完后,还有高位没有进行相加,也就是两者的位数不一致,导致有高位数字还没有完成相加
- 当数组中还有数字时,再用循环将其余的位一位一位地加到
retarr
中 - 当k还有高位存在时,也用循环将高位一位一位地加到
retarr
中
- 当数组中还有数字时,再用循环将其余的位一位一位地加到
- 当前两种情况同时出现时,我们就不能简单地用循环来将数组中剩余的数字或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
处理后:
第二步:ksize
已经为0了,但A中还有数字,所以我们要继续进行相加。
A中的第二个9与next
相加,得10,需要进位,next继续为1,将相加的结果%10放入retarr
中,同时numSzie减1
第三步:与第二步相似,A中的第一个9与next
相加,得10,需要进位,next继续为1,将相加的结果%10放入retarr
中,同时numSzie
减1
第四步:此时numSize
已经为0了,所以要结束循环。
但还要注意,next
此时还为0,所以循环结束后还要将next
放入retarr
中。
最后将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;
}
以上是关于数组形式的整数加法的主要内容,如果未能解决你的问题,请参考以下文章