数组形式的整数加法

题目:

0017db00501d410e917a6f59e694f0a8.png

整数的 数组形式  num 是按照从左到右的顺序表示其数字的数组。例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。
给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。

答案:如图

int* addToArrayForm(int* num, int numSize, int k, int* returnSize)
{
	//算出数字的位数
	int ksize = 0;
	int kNum = k;
	while (kNum) 
	{
		ksize++;
		kNum /= 10;
	}
	
	//比较一下位数哪个大一点,以便更好的开辟空间
	int len = ksize > numSize ? ksize: numSize;
	//开辟空间  指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量)
	int* retArr = (int*)malloc(sizeof(int) * (len + 1));

	//开始计算
	int Ni = numSize - 1;
	int nums = 0;
	int nextNum = 0;//进位
	int n = 0;
	while (len--)
	{
		
		if (Ni >= 0)
		{
			nums = num[Ni];
			Ni--;
		}
		int ret = nums + k % 10 + nextNum;
		k / 10;

		if (nums > 9)
		{
			nextNum = 1;
			ret -= 10;
		}
		else
		{
			nextNum = 0;
		}
		retArr[n] = ret;
		n++;
	}
	if (nextNum == 1)
	{ 
		retArr[n] = 1;
		n++;
	}

	//倒置
	int left = 0, right = n-1;
	while (right > left)
	{
		int tem = retArr[left];
		retArr[left] = retArr[right];
		retArr[right] = tem;
		left++;
		right--;
	}

	*returnSize = n;
	return retArr;
}

解析:共六步

【1】这道题目首先我们审题

对于 num = 1321 ,数组形式是 [1,3,2,1] 
给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 

这就类似整数的加法,依次从数组最右面开始提取与整数k最右面的数进行相加,注意进位即可

返回 整数 num + k 的 数组形式,代表我们需要额外开辟数组进行返回

【特别注意】,两数相加其和的位数存在比最多位数len的多一位

如123+921=1066,以及等于最多位数len,如123+321=666

具体做法

(1 ) 算出整数位数

定义ksize来计数位数

将k赋值kNum以防k丢失

 int ksize = 0;
    int kNum = k;
    while (kNum) 
    {
        ksize++;
        kNum /= 10;
    }

(2) 比较数组与整数k位数

这里我们采用三目运算符,以便更好运算

int len = ksize > numSize ? ksize: numSize;

(3) 开辟新的数组空间

这里需要有需要补充malloc函数知识

开辟空间用malloc函数,其头文件是#include <malloc.h> 

malloc函数用法 : 指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量


int* retArr = (int*)malloc(sizeof(int) * (len + 1));

len+1,即,实现数组位次向后加一

(4) 开始计算,实现单位数加法

注意:数组的读取是从右边开始进行读取,例如:【1,2,3,4】,根据题目要求表示整数1234整数的加法是从个位开始,即读取数组要在右面进行读取

其中数组的读取用下标进行访问

整数用%进行访问
    int Ni = numSize - 1;
    int nums = 0;
    int nextNum = 0;//进位
    int n = 0;
    while (len--)
    {
        
        if (Ni >= 0)
        {
            nums = num[Ni];
            Ni--;
        }

解释:

有两种情况

(1)数组位数大,循环次数是数组的位数

随着数组下标大小的减少,不会存在数组位数为负数

b12d6d3e248c4c398980475551fc7600.png

(2)整数位数大,循环次数是整数的位数

随着整数位数减少,数组下标会减小为-2,存在数组访问溢出,程序会出错

故,采用上种方法,当数组下标变为-1,-2以及更小的负数时将数组的值赋值为0;

7c2877aa357748eba06966d92801c59c.png


        int ret = nums + k % 10 + nextNum;
        k / 10;

解释:将整数k 进行右边个位数移除,以便下一个十位数成为个位数,进行%,提取个位数进行加法运算

判断是否进位

        if (nums > 9)
        {
            nextNum = 1;
            ret -= 10;
        }
        else
        {
            nextNum = 0;
        }
        retArr[n] = ret;
        n++;

        }

解释:这里我们采取将两数相加结果采取倒置处理,有两点原因

(1)使用n进行计位n++进行计位,比较方便

(2)不能确定两数相加是否数组位次会出现len+1的情况

如图图例,其中(1)的储存是rstArr[4]={3,2,0,1}

(2)的储存是rstArr[3]={3,1,2}

这样就合理的解决了两数相加是否数组位次会出现len+1的情况

1a3037c7eacb4d8f8d5ce7f16001e76d.png

   

上述代码是进行整数或者数组的位数内运算,最高位数不会超过len即不会出现位次进位的情况

举例123+23=146
    if (nextNum == 1)
    { 
        retArr[n] = 1;
        n++;
    }

解释:如果两位数相加进位使得数组位次len+1,那么需要将进位放置前面

举例901+99=1000,使得数组位次len+1,进位情况,则采取当前代码进行处理

这里注意数组的读取是从右边开始进行读取,例如:【1,2,3,4】,根据题目要求表示整数1234整数的加法是从个位开始,即读取数组要在右面进行读取

其中数组的读取用下标进行访问

整数用%进行访问
    int Ni = numSize - 1;
    int nums = 0;
    int nextNum = 0;//进位
    int n = 0;
    while (len--)
    {
        
        if (Ni >= 0)
        {
            nums = num[Ni];
            Ni--;
        }

解释:

有两种情况

(1)数组位数大,循环次数是数组的位数

随着数组下标大小的减少,不会存在数组位数为负数

b12d6d3e248c4c398980475551fc7600.png

(2)整数位数大,循环次数是整数的位数

随着整数位数减少,数组下标会减小为-2,存在数组访问溢出,程序会出错

故,采用上种方法,当数组下标变为-1,-2以及更小的负数时将数组的值赋值为0;

7c2877aa357748eba06966d92801c59c.png


        int ret = nums + k % 10 + nextNum;
        k / 10;

解释:将整数k 进行右边个位数移除,以便下一个十位数成为个位数,进行%,提取个位数进行加法运算

判断是否进位

        if (nums > 9)
        {
            nextNum = 1;
            ret -= 10;
        }
        else
        {
            nextNum = 0;
        }
        retArr[n] = ret;
        n++;

        }

解释:这里我们采取将两数相加结果采取倒置处理,有两点原因

(1)使用n进行计位n++进行进位,比较方便

(2)不能确定两数相加是否数组位次会出现len+1的情况

如图图例,其中(1)的储存是rstArr[4]={3,2,0,1}

(2)的储存是rstArr[3]={3,1,2}

这样就合理的解决了两数相加是否数组位次会出现len+1的情况

1a3037c7eacb4d8f8d5ce7f16001e76d.png

   

上述代码是进行整数或者数组的位数内运算,最高位数不会超过len即不会出现位次进位的情况

举例123+23=146
    if (nextNum == 1)
    { 
        retArr[n] = 1;
        n++;
    }

解释:如果两位数相加进位使得数组位次len+1,那么需要将进位放置前面

举例901+99=1000,使得数组位次len+1,进位情况,则采取当前代码进行处理

(5) 倒置目标数组元素

采用c语言常规置换元素方法即可
    int left = 0, right = n-1;
    while (right > left)
    {
        int tem = retArr[left];
        retArr[left] = retArr[right];
        retArr[right] = tem;
        left++;
        right--;
    }

(6) 返回位数以及目标数组

    *returnSize = n;
    return retArr;

以上就是如何进行数组形式的整数加法的运算了

如果对您有帮助话点一个免费的赞和收藏叭!

  

  • 24
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值