数组形式的整数加法(C语言实现)

题目描述:

整数的 数组形式  num 是按照从左到右的顺序表示其数字的数组。

  • 例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。

给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。

例如:

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

思路

本题是将数组内的数字按整数形式和另一个整数相加,这里考察的大数相加和取每一位数字的知识。大数相加有极限,因此不能将数组的每一位变成整形相加,以免发生溢出。
本题思路是将数组的每一位与数字的每一位相加放进另一个数组,之后将数组逆置。 数组的每一位和数字的每一位相加==两个个位数相加,如果满十则进一。

解题方法

1.开辟一个能承载相加之后位数的空间,两个数相加之后,位数最多是大数位数+1,因此需要寻找大数位数,找到后开辟数组。                                                                                       2.开辟数组之后,将数组的每一位与数字每一位相加(循环控制,以大数位数为限制条件),如果满十则记录一个变量为1,下一循环将变量加入相加算式,将每次循环得到位数放入新开辟的数组中。(其中可能会出现数组越界情况,比如题目数组的位数小于数字位数时会出现数组越界,因此在循环开始时就要判断,如果变量>=0,则将数组元素赋值给另一变量。)                                                                                                                                     3.将得到的数组逆置,变回题目要求 

 图片讲解:三种情况

 代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* addToArrayForm(int* num, int numSize, int k, int* returnSize) {
int KSize=0;
//找出k的位数
int ki=k;
while(ki)
{
    KSize++;
    ki/=10;
}
//比较k和num的位数,取较大值+1开辟空间
int len=numSize>KSize?numSize:KSize;
//取得较大位数
int* retSize=(int*)malloc(sizeof(int)*(len+1));

int ret=0;//位数和
int reti=0;//调用开辟数组的元素
int numret=0;//进位
int Ai=numSize-1;
//取位加减
while(len--)
{
//判断数组是否越界
int a=0;
if(Ai>=0)
{
a=num[Ai];
Ai--;
}

//相加
ret=a+k%10+numret;
k/=10;
//判断位数
if(ret>9)
{
ret-=10;
numret=1;
}
else
{
numret=0;
}

retSize[reti]=ret;//将得到的数放入开辟数组
reti++;

}
//出循环后仍有可能满十,因此将最后一位制成1
if(numret==1)
{
    retSize[reti]=1;
    reti++;
}


//逆置
int left=0;
int right=reti-1;
while(left<right)
{

int tmp=retSize[left];
retSize[left]=retSize[right];
retSize[right]=tmp;

left++;
right--;

}


*returnSize=reti;
return retSize;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值