对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。
给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。
这种题型由于数字太大,一般来说字节的储存空间是不够的,
所以利用竖式加法进行。
int* addToArrayForm(int* A, int ASize, int K, int* returnSize){
int i = K;
int ksize = 0;
int k = K;
while (i)
{
i /= 10;
ksize++;
}
int len = ksize > ASize ? ksize : ASize;
int* retarr = (int*)malloc(sizeof(int) * (len + 1));
i = 1;
int num = 0;
int cur = 0;
while (len--)
{
int p;
if (i > ASize)//鉴别是否k是否大于数组所表示的数
{
p = k % 10 + num;//大于情况
}
else
{
p = A[ASize - i] + k % 10 + num;//小于情况
}
k /= 10;//
i++;
if (p > 9)
{
num = 1;//表示进位
p %= 10;
}
else {
num = 0;
}
retarr[cur] = p;
cur++;
}
if (num == 1)//这里只是进行了len的位数,所以还要鉴别是否进位
{
retarr[cur] = 1;
cur++;
}
int right = cur -1;
int left = 0;
while (left < right)
{
int tmp = retarr[left];
retarr[left] = retarr[right];
retarr[right] = tmp;
left++;
right--;
}
*returnSize = cur;
return retarr;
}
这里需要注意的是
1 k有可能大于数组,所以这时候不处理,会造成越界。
2 这里循环只是进行了最长数字的次数,如果最大位进位的话,会造成错误,所以要进行检验 是否有进位。
3 这里放入数组是倒着放的,所以最后要进行逆置。