leetcode-数组形式的整数加法-7

数组形式的整数加法

题目要求
  对于非负整数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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43580319/article/details/113186179