数组形式的整数加法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


Leetcode989:


提示:以下是本篇文章正文内容,下面案例可供参考

题干:

//数组形式的整数加法
//对于非负整数x而言,x=1234,那么数组形式就是[1,2,3,4],给定非负整数x的数组形式A,那么返回x+k的数组形式
//实例:输入A=[1,2,,0,0],K=34
//输出:[1,2,3,,4]
//解释:1200+34=1234

1.思路是这样的:

我们把一个数组的每个元素与给定的数字进行相加,把相加的结果的每个数放进一个新的数组中,最后返回这个新数组的地址,再打印出来就行

1.我们先判断这个数字是几位数

int *addToArrayForm(int* A, int ASize, int k, int* returnSize){
	int kSize = 0;
	int kNum = k;
	//计算k是几位数
	while (kNum)
	{
		++kSize;
		kNum /= 10;
	}

2.判断完数字是几位数后,我们来开辟一个空间,也就是新数组的空间,但是我们考虑到这个新数组的大小是多少,仔细分析后觉得,新数组大小应该是这个数字和这个素组化成整数形式后两个数中更大的那一个,而且还要比更大的那一个再多一个字节,因为两个数相加,可能会进1,比如两个四位数相加,有可能是五位数,所以开辟空间大小确定了下来。

然后我们开始进行循环相加:len--就是当len=0时,两个的最高位相加完了,退出循环,我们最终进1,nextnum=1,但我们开辟的是len+1,循环里面是len,最后一个完全是留给最高位相加进1的。在第二个循环if(Ai>=0)这部分我们考虑到数组的长度比数字的长度小,比如[9 9]+387,此时当数组的最高位加完之后,就没有了元素,我们即使想要0都没有,那么在这个循环中,当Ai也就是下标为负数时,这时候会越界访问,这时我们可以令a=A[Ai],此时Ai=-1/-2,但a=0就满足了,还有一种情况是[1 2 3 4]+99,这种情况下我们不必担心,因为99这个数,我们得到每一位都是靠%和/来实现的,当进行第三位时,99第三次除以的结果是0,满足我们需要的条件。

然后ret就是新数组的某一位:数组A的某一位加上k的某一位,加上后面一位进1的nextnum

	int len = ASize > kSize ? ASize: kSize;
	int* retArr = (int*)malloc(sizeof(int)*(len+1));
	int Ai = ASize - 1;//指向数组的最后一个下标的箭头
	int reti = 0;
	int nextnum = 0;//加法时候进位
	while (len--)
	{
		int a=0;
		if (Ai >= 0)
		{
			a = A[Ai];
			Ai--;
		}
		int ret = a + k % 10+nextnum;
		k /= 10;
		if (ret > 9)
		{
			ret -= 10;
			nextnum = 1;
		}
		else
		{
			nextnum = 0;
		}
		retArr[reti] = ret;
		++reti;
	}
	if (nextnum == 1)
	{
		retArr[reti] = 1;
		++reti;
	}
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('ignore') import ssl ssl._create_default_https_context = ssl._create_unverified_context 

2.逆置

上面的代码我们是把数组A的和数字k的最低位相加放进新数组的开始位置,此时我们应该进行逆置

最后返回这个指针(也就是这个数组的首地址),还要释放一下


	//将新数组逆置一下
	int left = 0;
	int right = reti - 1;
	while (left < right)
	{
		int tmp = retArr[left];
		retArr[left] = retArr[right];
		retArr[right] = tmp;
		++left;
		--right;
	}
	*returnSize = reti;
	return retArr;
	free(retArr);
	retArr = NULL;

 3.主函数部分

 在主函数里,我们初始化这个A数组和k,接收的是int*指针,所以我们用一个对应的指针来接收,

再取打印,我们传&returnsize的地址,用指针去接收,为的就是改变这个新数组的大小,我们起初定义returnsize=0,在接口部分令returnsize=reti,改变了新数组的元素大小,为的就是去打印这个新数组

int main()
{
	int arr[] = { 1, 2, 0, 0 };
	int k = 34;
	int ASize1 = sizeof(arr) / sizeof(arr[0]);
	int returnsize = 0;
	int* f = addToArrayForm(&arr, ASize1, k, &returnsize);
	int i = 0;
	for (i = 0; i < returnsize; i++)
	{
		printf("%d ", f[i]);
	}
	return 0;
}

 



  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值