链接: 数组形式的整数加法
思路:(C语言版本) 这道题的难点在于我们不知道两个数最高位是否还需要进位。。。。
但是我们可以确定的一个是最多只能向前进一位!为什么呢?大家想想,比如两个9相加,最高也只是18,只能向前进一位。
- 所以我们第一步先求出数组这个数字的长度与k的长度,然后取长的那个,创建一个新数组newarr,大小为长的那个数字的长度加一!
- 第二步就是从个位开始,分别分解两个数,然后求和,并且判断是否有进制位,有的话存起来,给下一位相加时候加上去,以此循环,直到两个数都分解完成。
- 最后还要判断一下是否还存着一个进制位没有加上去,有的话就给newarr的最高位加一,然后将newarr反转过来(因为我们采取先尾插后反转的方式)。
代码:
代码语言:javascript复制/**
* 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;
}