题目描述:
整数的 数组形式 num
是按照从左到右的顺序表示其数字的数组。
- 例如,对于
num = 1321
,数组形式是[1,3,2,1]
。
给定 num
,整数的 数组形式 ,和整数 k
,返回 整数 num + k
的 数组形式 。
例如:
输入:num = [1,2,0,0], k = 34 输出:[1,2,3,4] 解释:1200 + 34 = 1234
思路
本题是将数组内的数字按整数形式和另一个整数相加,这里考察的大数相加和取每一位数字的知识。大数相加有极限,因此不能将数组的每一位变成整形相加,以免发生溢出。
本题思路是将数组的每一位与数字的每一位相加放进另一个数组,之后将数组逆置。 数组的每一位和数字的每一位相加==两个个位数相加,如果满十则进一。
解题方法
1.开辟一个能承载相加之后位数的空间,两个数相加之后,位数最多是大数位数+1,因此需要寻找大数位数,找到后开辟数组。 2.开辟数组之后,将数组的每一位与数字每一位相加(循环控制,以大数位数为限制条件),如果满十则记录一个变量为1,下一循环将变量加入相加算式,将每次循环得到位数放入新开辟的数组中。(其中可能会出现数组越界情况,比如题目数组的位数小于数字位数时会出现数组越界,因此在循环开始时就要判断,如果变量>=0,则将数组元素赋值给另一变量。) 3.将得到的数组逆置,变回题目要求
图片讲解:三种情况
代码
/**
* 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 ki=k;
while(ki)
{
KSize++;
ki/=10;
}
//比较k和num的位数,取较大值+1开辟空间
int len=numSize>KSize?numSize:KSize;
//取得较大位数
int* retSize=(int*)malloc(sizeof(int)*(len+1));
int ret=0;//位数和
int reti=0;//调用开辟数组的元素
int numret=0;//进位
int Ai=numSize-1;
//取位加减
while(len--)
{
//判断数组是否越界
int a=0;
if(Ai>=0)
{
a=num[Ai];
Ai--;
}
//相加
ret=a+k%10+numret;
k/=10;
//判断位数
if(ret>9)
{
ret-=10;
numret=1;
}
else
{
numret=0;
}
retSize[reti]=ret;//将得到的数放入开辟数组
reti++;
}
//出循环后仍有可能满十,因此将最后一位制成1
if(numret==1)
{
retSize[reti]=1;
reti++;
}
//逆置
int left=0;
int right=reti-1;
while(left<right)
{
int tmp=retSize[left];
retSize[left]=retSize[right];
retSize[right]=tmp;
left++;
right--;
}
*returnSize=reti;
return retSize;
}