链接: 数组形式的整数加法
思路:(C语言版本) 这道题的难点在于我们不知道两个数最高位是否还需要进位。。。。
但是我们可以确定的一个是最多只能向前进一位!为什么呢?大家想想,比如两个9相加,最高也只是18,只能向前进一位。
代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* addToArrayForm(int* num, int numSize, int k, int* returnSize){
int tmp = k;
int ksize = 0;
while(tmp)
{
ksize++;
tmp /= 10;
}
//求出两个长的那个
int len = ksize > numSize ? ksize + 1 : numSize + 1;
//然后创建一个len长度的新数组
int* newarr = (int*)malloc(sizeof(int)*len);
//从右往左k的每一位和数组里面的每一位相加
int ki = 0;
int ai = numSize - 1;
int next = 0;//进位
int sumi = 0;//用于赋给newarr的下标标志
while(ki < ksize || ai >= 0)
{
//分解出num的每一位
int aval = 0;
if(ai >= 0)
{
aval = num[ai];
}
//分解出k的每一位
int kval = 0;
if(ki < ksize)
{
kval = k % 10;
k /= 10;
}
int sum = kval + aval + next;
//判断一下是否需要进位
if(sum > 9)
{
sum -= 10;
next = 1;
}
else
{
next = 0;
}
//将sumi的数值赋给新数组newarr
newarr[sumi++] = sum;
ai--;
ki++;
}
//判断是否还有进位
if(next == 1)
newarr[sumi++] = 1;
//最后逆置新数组newarr
int begin = 0;
int end = sumi - 1;
while(begin < end)
{
int tmp = newarr[begin];
newarr[begin] = newarr[end];
newarr[end] = tmp;
++begin;
--end;
}
//将长度以及数组返回
*returnSize = sumi;
return newarr;
}