【题目练习】字符串相乘

题目:

解法:

运行结果:

过程:

一、读题

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',不然乱码。

相关推荐
0+1111 小时前
算法 --链表
数据结构·算法·leetcode·链表
aqiu1111111 小时前
【C++算法打怪专栏】C++ `unordered_set` 常用初始化与插入方法总结
开发语言·c++·算法
Terra.K2 小时前
高精度阶乘求和模板深度解析
开发语言·c++·算法
Peregrine92 小时前
C++ - > 类和对象
java·c++·算法
Gigavision3 小时前
DEAP数据集 2026最新Transformer算法 DEAP 数据集 下载
深度学习·算法·transformer
夜之眷属4 小时前
PriorityQueue:for-each 遍历和 poll 取出,顺序一样吗?
java·服务器·数据结构·后端·算法
地平线开发者4 小时前
不是线程越多越快:用 hrt_model_exec 在 征程6M 上给 YOLOv5x 建立性能基线
算法
姜鱼问生5 小时前
fail2ban 实战:从默认配置到生产可用
后端·算法·架构
垆边人似月.5 小时前
华为题:全排列
算法·深度优先·图论