leetcode--数组形式的整数加法 ---C实现

题目描述:对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。

给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-to-array-form-of-integer

示例

输入:A = [1,2,0,0], K = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234

思路:

将 K 的每一位分解出来,与数组A内的元素按下标相加,若相加结果> 9,则向下一位进1。将结果数组形式输出的时候应注意,输出的只是目标数组的逆序。过程如下图所示。
在这里插入图片描述

示例 3:这是一个需要进位的例子

输入:A = [2,1,5], K = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021

在这里插入图片描述
此时的结果数组长度增加,在写代码的时候需要注意。

具体代码实现如下

#include<stdio.h>
#include<stdlib.h>
int* addToArrayForm(int* A, int ASize, int K, int* returnSize)
{
    
    
	int kSize = 0;
	int kNum = K;
	while (kNum)//计算出K的长度
	{
    
    
		++kSize;
		kNum /= 10;
	}
	int len = ASize > kSize ? ASize : kSize;//判断A和K的大小,以大的为基准
	int*retArr = (int*)malloc(sizeof(int)*(len + 1));//申请空间

	//思想:A和K 按位相加  大于9,向前一位进1
	int Ai = ASize - 1;//由最后一位开始相加
	int reti = 0;//相加后得到的数组的下标
	int nextNum = 0;//进位
	while (len--)
	{
    
    
		int a = 0;
		if (Ai >= 0)//取出数组A的每一位元素
		{
    
    
			a = A[Ai];
			Ai--;//取出一位后,下标减一
		}
		int ret = a + K % 10 + nextNum;//相加后得到的数组的元素的值
		K /= 10;//将K的最后一位分离出来

		if (ret >9)
		{
    
    
			ret -= 10;//大于9,进位之后留下的值为 ret-10
			nextNum = 1;
		}
		else
		{
    
    
			nextNum = 0;
		}
		retArr[reti] = ret;//对数组的每一位进行赋值
		++reti;//两个数组每按位相加一次,数组下标加1
	}

	//如果遇到 1999 + 9000 这种需要增加一位的情况
	if (nextNum == 1)
	{
    
    
		retArr[reti] = 1;//增加的一位最大为1
		++reti;
	}
	int left = 0, right = reti - 1;
	while (left <right)//数组的逆置
	{
    
    
		int tmp = retArr[left];
		retArr[left] = retArr[right];
		retArr[right] = tmp;
		++left;
		--right;
	}
	*returnSize = reti;
	return retArr;
}
int main()
{
    
    
	int A[] = {
    
     1, 2, 0, 0 };
	int ASize = sizeof(A) / sizeof(A[0]);
	int K = 34;
	int returnSize = 0;
	int* retArr = addToArrayForm(A, ASize, K, &returnSize);
	int i = 0;
	for (i = 0; i < returnSize; i++)
	{
    
    
		printf("%d ", retArr[i]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/du1232/article/details/111250246