数组形式的整数加法
题目要求
对于非负整数x而言,x的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果x=1231,那么其数组形式为[1,2,3,1]。给定非负整数x的数组形式A,返回整数x+k的数组形式。
示例1:
输入:A = [2,1,5],k = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021
思路
第一步,通过两个数字的位数判断开辟空间的大小,开辟空间大小要比数字的位数大一位,为了防止最高位进位。第二步,计算两个数的每一位的值,并将这些加在一起,存在创建的新空间中。第三步,检测最高位是否进位,如果进位,需要在最高为上添加一个1。第四步,由于新数组中我们是从低位到高位往数组中进行输入,因此,需要把新数组中的元素进行逆序,注意,我们不能将输入的低位数字直接放到数组的末尾,因为,不确定最高位是否需要进位,也就不知道低位放在新数组中的哪一个下标处。
图解
代码实现
int* addToArrayForm(int* A, int ASize, int K, int* returnSize){
//计算K是一个几位数
int num = K;
int KSize = 0;
while (num)
{
num /= 10;
KSize++;
}
//判断内存应该创建多大
int n = KSize > ASize ? KSize + 1 : ASize + 1;
//创建内存
int* str = malloc(sizeof(int)*n);
int KNum = 0;//某一位K的值
int Ai = ASize - 1;//A中数组的下标
int next = 0;//进位
int i = 0;//str的下标
while (K > 0 || Ai >= 0)
{
//计算某一位K的值
KNum = K % 10;
K /= 10;
int ANum = 0;//某一位A的值
//计算某一位A的值
if (Ai >= 0)
{
ANum = A[Ai];
Ai--;
}
//判断是否进位
int ret = KNum + ANum + next;
if (ret >= 10)
{
ret %= 10;
next = 1;
}
else
{
next = 0;
}
//将每一位的值传进str
str[i] = ret;
i++;
}
//最高位进位
if (next == 1)
{
str[i] = 1;
i++;
}
//控制输出元素个数
*returnSize = i;
//逆置
int left = 0;
int right = i - 1;
while (left <= right)
{
int tmp = str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
return str;
}