题目:
整数的 数组形式 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)数组位数大,循环次数是数组的位数
随着数组下标大小的减少,不会存在数组位数为负数
(2)整数位数大,循环次数是整数的位数
随着整数位数减少,数组下标会减小为-2,存在数组访问溢出,程序会出错
故,采用上种方法,当数组下标变为-1,-2以及更小的负数时将数组的值赋值为0;
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的情况
上述代码是进行整数或者数组的位数内运算,最高位数不会超过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)数组位数大,循环次数是数组的位数
随着数组下标大小的减少,不会存在数组位数为负数
(2)整数位数大,循环次数是整数的位数
随着整数位数减少,数组下标会减小为-2,存在数组访问溢出,程序会出错
故,采用上种方法,当数组下标变为-1,-2以及更小的负数时将数组的值赋值为0;
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的情况
上述代码是进行整数或者数组的位数内运算,最高位数不会超过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;
以上就是如何进行数组形式的整数加法的运算了
如果对您有帮助话点一个免费的赞和收藏叭!