对于非负数X而言,X的数组形式是每位数字按从左到右的顺序形成的数组。例如:如果X=1231,那么其数组形式为【1,2,3,1】。
给定非负整数X的数组形式A,返回整数X+K的数组形式
例如:输入:A=【1,2,0,0】,K=34
输出:【1,2,3,4】
解释:1200+34=1234
下面我通过代码配合注释
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* addToArrayForm(int* num, int numSize, int k, int* returnSize){//retrunSize为输出型参数
int KSize=0;//计算k是多少位
// while(k)
// {
// ++KSize;
// k/=10;//或者k/=10,KSize++
// }但是这样会把k干掉了,找不到K了
int kNum=k;
while(kNum)
{
++KSize;
kNum/=10;
}
int len=KSize>numSize?KSize+1:numSize+1;
int *retArr=(int*)malloc(sizeof(int)*(len+1));//新开的数组比两个其中最大的要大1
int numi=numSize-1;//num[],k,numi就是个位上的值,numi是倒着取得
//统计最后一位的下标,但是那个整数不用控制
int reti=0;//结果数组的下标
int nextNum=0;//表示进位
while(len--)//用len控制循环,长度为多少就走len次,--len走(len-1)次
{
int a=0;
if(numi>=0)//表示合法
{
a=num[numi];
numi--;
}
int ret=a+k%10+nextNum;
// int ret=num[numi]+k%10+nextNum;//加出来的结果之后,将它放在retArr中去,有进位把1加上,没进位为0
// numi--;
k/=10;
if(ret>9)
{
ret-=10;//如果ret=15,此时变为ret=5
nextNum=1;
}
else{
//ret不需要处理
nextNum=0;//保证nextNum为0,要不然可能为1
}
retArr[reti]=ret;
reti++;
}
if(nextNum==1)//说明还有一个进位没有处理
{
retArr[reti]=1;
reti++;
}
//出来了之后还要逆置一下数组
int left=0,right=reti-1;
while(left<right)
{
int temp=retArr[left];
retArr[left]=retArr[right];
retArr[right]=temp;
left++;
right--;
}
*returnSize=reti;
return retArr;
}