题目:

解法:


运行结果:

过程:
一、读题
1、不能直接转 int/long,数字最长 200 位,普通整型根本存不下。
2、不能调用大数库。
3、输入只有数字字符。
例子:"123" * "456" = "56088"
二、思考无法直接算(num1)*(num2),思考手写乘法计算方法,;例如:

所以:第一个数 n 位,第二个数 m 位,乘积最多 n+m 位。3 位 ×3 位最多 6 位。
999 * 999 = 998001,正好 6 位。
所以我可以提前开一个长度 n+m 的数组,存每一位的计算结果,初始全部填 0
三、字符串在程序里:
num1 = "123",下标:0:'1' 1:'2' 2:'3',最右边个位下标是 2
num2 = "456",下标:0:'4' 1:'5' 2:'6',最右边个位下标是 2
1、笔算的时候,都是拿最右边(个位)开始乘,所以循环必须倒着遍历字符串,i 从 n‑1 往 0 走,j 从 m‑1 往 0 走。
2、现在:num1i 和 num2j 两个数字相乘。
比如 i=2(数字 3),j=2(数字 6),3*6=18。这个结果放在哪里?
18 的低位8,放在结果数组靠后的位置,18 的进位1,放在它左边一位
3、手动试几组:
i=2,j=2 → 36=18 → 低位放在索引 5,进位放 4
i=2,j=1 →35=15 → 低位放在索引 4,进位放 3
4、计算:pos2 = i + j + 1(存低位),pos1 = i + j(存进位)
i=2,j=2:pos2=5,pos1=4
i=2,j=1:pos2=4,pos1=3
5、得到核心公式:num1 i × num2 j,结果落在数组pos1、pos2两个位置。
四、想每一步计算怎么做
字符转数字:num1i - '0',把字符 '3' 变成整数 3。
两个数字相乘得到 product。
【pos2 这个位置之前已经存过别的计算结果,不能直接覆盖!要把原来的值加进来。】
sum = product + res_arrpos2
sum 拆分成个位、进位:
res_arrpos2 = sum % 10 → 个位留在 pos2
res_arrpos1 += sum / 10 → 进位加到 pos1(是 +=,不是 =,pos1 可能还有别的进位过来)
【这里很容易写错,一开始我脑子会想直接写 res_arr pos1 = sum/10;马上反应过来不行,多个乘法会往同一个 pos1 加进位,必须累加。】
五、两层循环
循环跑完,res_arr 数组里面存好了全部数字,但是数组开头会有一堆前导 0
六、
1、需要跳过前面连续的 0。start指针不断往后走,直到 res_arr start!=0。
2、特殊边界:全部都是 0!
比如输入"0" × "1234",数组全部是 0。此时 start 会走到 n+m 的位置。
如果 start == n+m,直接返回字符串 "0",不能返回空字符串。
3、剩下有效数字,数字转字符:res_arrk + '0',存进输出字符串。
4、C 语言字符串末尾必须手动补 '\0',不然乱码。