【题目练习】字符串相乘

题目:

解法:

运行结果:

过程:

一、读题

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

相关推荐
dialect_9 小时前
KMP算法
开发语言·c++·算法
reikocao10 小时前
卡尔曼滤波的动态机制:P如何改变融合权重
算法
漂流瓶jz10 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
吞下星星的少年·-·11 小时前
Div.2 CF 1130B题(构造,贪心)
算法·贪心·构造
是main不是漫12 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
深圳市快瞳科技有限公司13 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
专注仿真15 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄15 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
Tisfy15 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
D e re k ZH16 小时前
P5025 [SNOI2017] 炸弹
c++·算法