今天又兴致突起,想刷一道leetcode上的题,好家伙,直接一题做了一天,太难了。
问题描述
分析
相信很多人都会想着先将A转换为整数形式,如A=[2,1,5],转换为整数形式就是2100+110+5*1=215,但这样对于超大整数不行,如果A中有20个数,那么将没有一个类型的数可以装下一个20位的数,这样计算就会失败。那应该怎么办呢,这就要用到我们小学的知识了。
如
1 2 0 0
++ 3 4
————
1 2 3 4
即定义另一个数组来接收相加后的值
代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* addToArrayForm(int* num, int numSize, int k, int* returnSize) {
int kSize = 0;
//确定k的长度
int knum = k;
while (knum)
{
kSize++;
knum /= 10;
}
//开辟储存空间
int len = numSize>kSize ? numSize : kSize;
int* retarr = (int*)malloc(sizeof(int)*(len + 1));
//开始计算
int nexnum = 0;
int ret, numi = numSize;
int i = 0;
int x = len;
while (len--)
{
if (numi > 0)
{
ret = num[numi - 1] + k % 10 + nexnum;
}
else
{
ret = k % 10 + nexnum;//为了防止k的位数大于numSize,
}
k /= 10;
if (ret >= 10)
{
ret -= 10;
nexnum = 1;
numi--;
}
else
{
numi--;
nexnum = 0;//此处要重置nextnum
}
retarr[i] = ret;
i++;
}
if (nexnum == 1)
{
retarr[x] = 1;//考虑到像两位数加两位数变为三位数,或其他位数增加的情况
i++;
}
//逆序,原先储存在retarr中的数字为倒的
int left, right;
if (i == x)
{
left = 0, right = x-1;//还是考虑到位数相加的情况,right情况不同
}
else
{
left = 0, right = x;
}
while (left<right)
{
int tmp = 0;
tmp = retarr[left];
retarr[left] = retarr[right];
retarr[right] = tmp;
left++;
right--;
}
//returnSize是需要我们给他赋予值的,而不是给我们用的,即把retarr的位数传过去
*returnSize = i;
return retarr;
}
好了,以上就是我对此题的理解,如有纰漏,还请各位大佬指正,三克油!