C语言画图简易分析数组形式的整数加法

1 题目描述

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

给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。

1.1 题目解释

将上述枯燥的文字变为形象的图片如下:蓝色图片为数组,橙色图片展示的是一个非负整数,记为K。此题目的是为了将K的值按如图所示位置加给数组,于是展示的结果为:
X+K=[1,2,0,0]+[0,0,3,4]=[1,2,3,4];

1.2 输入输出样例

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

图示

2 分析过程

2.1 开辟空间存储

首先,我们需要让数组和整数相加,所以第一步:应该提取数组每位的数和整数每位的数,并判断数组和整数位数的长度(因为需要动态的开辟内存malloc,来存放需要返回的数组)并取长的那个开辟内存。

此时,还需要找出数字的位数,怎么找呢?下面代码给出解释:

//判断数字的位数
	int kSize = 0;
	int kNum=K;
	while (kNum){//判断每位数字是否位0
		++kSize;//不为零,需要将数字位数加一
		kNum /= 10;
	}
//从数组和数字中比较大找出来开辟内存
	int len = ASize > kSize ? ASize : kSize;//ASize为数组位数大小,kSize为数字位数大小
	int *retArr = (int*)malloc(sizeof(int)*(len+1));//开辟内存加一 防止进位溢出

2.2 对应位置相加

对对应位置相加,并非简单的加,还要考虑是否进位数组是否越界
举例证明进位和数组越界:

2.2.1 数组是否会越界

在这里插入图片描述
上图所示,蓝色为数组,橙色为数字,当数字位数大于数组位数时,进行加法时需要注意防止数组越界。

//判断数组是否越界
		int a = 0;//定义变量暂存数组第Ai位的数
		if (Ai >= 0){//判断Ai位是否越界访问
			a = A[Ai];
			Ai--;//Ai减,继续下一位比较
		}

没有越界的话,将每位的值加和保存起来;如果越界的话,数组最高位不需要改变了,直接进行数字与0的加法,然后计算每一位对应和。

//加每一位
		int ret = a + K % 10 + nextNum;
		K /= 10;//求数字下一位

2.2.2 是否有进位

在这里插入图片描述
上图所示,为进位展示,很简单,这里不再解释。下面给出进位代码和每位之和的值给数组的代码:

//判断是否有进位
		if (ret > 9){
			ret -= 10;//或者ret %=10;也可以
			nextNum = 1;//有进位,进位必然是1,读者可以思考下
		}
		else{
			nextNum = 0;//没有进位,将标志置位0
		}
		//将加和值给数组中存储
		retArr[reti] = ret;//将相加的值赋值给数组中存储
		++reti;//数组下标加一

其实关于进位,还有一种需要注意的是:最高位需要进位,那么我们需要进行如下判断:

//最后判断最高位相加是否大于10,大于的话有进位,否则没有进位
	if (nextNum == 1){
		retArr[reti] = 1;//将进位数1给数组中第reti位存储
	}

2.3 将加和保存的值逆置

由于比较常见我就不做分析,不懂的可以提问。

//逆置
	int left = 0;
	int right = reti - 1;
	while (left < right){
		int temp = retArr[left];
		retArr[left] = retArr[right];
		retArr[right] = temp;
		left++;
		right--;
	}

3 主函数怎么写

这是leetcode上一道很经典的习题,他需要认真分析每个细节,很锻炼考虑问题的全面性。还有就是此函数形式为:

int* addToArrayForm(int* A, int ASize, int K, int* returnSize)

此函数为输出型参数,主函数调用也需要特别注意,所以我列出我的主函数作为参考:

int main()
{
	int array[] = { 1, 2, 0, 0 };
	int len = sizeof(array) / sizeof(array[0]);
	int key = 34;
	int returnSize = 0;
	int *p = addToArrayForm(array, len, key, &returnSize);
	int *arr = (int *)malloc(sizeof(int)*(returnSize));//开辟returnSize大小的数组 用来存储返回的数组
	arr = p;//将返回值给数组中存储

	printf("%d\n", returnSize);
	for (int i = 0; i < returnSize; i++)
	{
		printf("%d ", arr[i]);
	}

	system("pause");
	return 0;
}

4 总结

全部参考代码详见链接
大佬们,一起学习吧,如有不正确理解,希望大佬们指正。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值