整数的 数组形式
num
是按照从左到右的顺序表示其数字的数组。
- 例如,对于
num = 1321
,数组形式是[1,3,2,1]
。给定
num
,整数的 数组形式 ,和整数k
,返回 整数num + k
的 数组形式 。示例 1:
输入:num = [1,2,0,0], k = 34 输出:[1,2,3,4] 解释:1200 + 34 = 1234示例 2:
输入:num = [2,7,4], k = 181 输出:[4,5,5] 解释:274 + 181 = 455示例 3:
输入:num = [2,1,5], k = 806 输出:[1,0,2,1] 解释:215 + 806 = 1021提示:
1 <= num.length <= 104
0 <= num[i] <= 9
num
不包含任何前导零,除了零本身1 <= k <= 104
根据题目的意思, 我们可以逐位相加。
假如num == 912, k = 110;
那么先计算 2 + 0, 等于2, 不进位。
再计算1 + 1, 等于2, 不进位。
再计算9 + 1, 等于10, 进一位, 同时改为等于0,
由于上一位进了一位, 所以最后最高位是1。
这里有一个问题。 就是假如这个数组无限大, 那么数组对应的整数就很难保存这个数据了。 这里可能很难理解, 可以这么想。 一个无符号整形最大储存多大的数?是不是4,294,967,296。这个数转换成数组形式也才10个数。 那么八个字节呢?计算器给出的是1.844674407370955e+19, 转换成数组形式也才19个数。 很显然不能计算这个数的大小。
那么怎么做才能不计算这个数的大小。然后逐位相加呢?
首先, 不管其他, 我们应该把数组空间开出来。 大小是多少呢? 我们要知道是k和num相加。 然后这两个数字不是k大, 就是num大。 k是整形, 4个字节。 最大是10位。 num的位数题中给了, 是numSize. 但是这两个数字相加可能会进位。 所以开辟的空间应该是11,或者numSize + 1之中大的那个。
所以开辟空间的代码为:int* newnum = (int*)calloc(fmax(11, numSize + 1), sizeof(int));
然后我们定义一个count计算数组的位数:
利用count充当新开的数组, 控制k和num的逐位相加后的数赋值依次给新开数组。
这是以num为主体, 但是如果num比k小。 光上述代码可能不够。当num == 22, k == 999的时候, numSize是2, 两次循环后, k还有数字没有放到新开数组中。
所以后续还要有一个以k为主体的代码:
最后进行逆置和返回:
以上, 就是OJ题数组形式的整数加法的解析。