LeetCode 989.数组形式的整数加法

📅 发布时间:2026/10/18 5:24:10
LeetCode 989.数组形式的整数加法
一、 题目描述二 、解题思路这题不能转成整数再相因为数据范围太大了,会发生溢出解释num.length可以到 10^4也就是说num可以表示一个一万位的整数。这个数远远超出long long约 19 位十进制数的表示范围。故必须用模拟竖式加法的方式逐位处理。核心考点大整数加法的数组模拟三、代码/** * Note: The returned array must be malloced, assume caller calls free(). */int*addToArrayForm(int*num,intnumSize,intk,int*returnSize){intk1k;intlen0;intret0;intadd0;//表示进位intaSizenumSize-1;intkSize0;// 1. 计算 k 的位数while(k10){k1/10;len;}// 2. 取 numSize, k的位数 的最大值 作为循环次数if(numSizelen){lennumSize;}// 3. 申请结果空间多 1 位用于最高位进位int*tmp(int*)malloc(sizeof(int)*(len1));// 4. 从低位到高位逐位相加while(len--){inta0;// 取出 num 当前位if(aSize0){anum[aSize];aSize--;}// 当前位相加num位 k最低位 进位retak%10add;k/10;// 处理进位if(ret10){ret-10;add1;}else{add0;}// 先存低位最后再反转tmp[kSize]ret;kSize;}// 5. 最高位还有进位补 1if(add1){tmp[kSize]1;kSize;}// 6. 反转数组for(intleft0,rightkSize-1;leftright;left,right--){intttmp[left];tmp[left]tmp[right];tmp[right]t;}*returnSizekSize;returntmp;}四、解释代码1.取最长位数if(numSizelen){lennumSize;}它决定了循环次数加法必须从最低位加到最高位。如果两个加数长度不同那么循环次数必须至少等于较长的那个数的位数否则高位会被漏掉。2.分配结果空间int*tmp(int*)malloc(sizeof(int)*(len1));两个数相加结果最多比最长的加数多一位所以是len1。3.处理[1,2]1234这种情况inta0;if(aSize0){anum[aSize];aSize--;}因为aSize的长度比k小所以后面aSize–之后会变成负把aSize为负数的部分规定都为0。4.处理最高位进位if(add1){tmp[kSize]1;kSize;}最高位进位只可能是1