
LeetCode43 字符串相乘(中等)
发布日期:2021-05-14 23:53:10
浏览次数:18
分类:精选文章
本文共 2740 字,大约阅读时间需要 9 分钟。
原题目
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1: 输入: num1 = “2”, num2 = “3” 输出: “6” 示例 2: 输入: num1 = “123”, num2 = “456” 输出: “56088” 说明: num1 和 num2 的长度小于110。 num1 和 num2 只包含数字 0-9。 num1 和 num2 均不以零开头,除非是数字 0 本身。 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings题目大意
计算两个大数相乘
题目分析
自己的复杂思路:用一个数组里面每个值乘以另一个数组中所有值,得到竖式计算每一行的值,再在每一行末尾填零,与第一行对其,然后进行多个大数相加,得到结果
他人的简洁方法:两个数相乘的最大长度为两个数的长度相加,定义一个int型数组,任意两个数相乘的乘积位置(乘积先不进位)等于两个位置的和,加一防止数组越界
,所以可以将任何两个数的乘积(即对应的位置的乘积)加起来求和。然后进位得到两数相乘的结果。完整代码
混乱代码:
char * multiply(char * num1, char * num2){ char *res=(char *)malloc(sizeof(char)*12110); if(num1[0]=='0'||num2[0]=='0') { strcpy(res,"0"); return res; } char s[120][12110]; for(int i=0; i<120; i++) { memset(s[i],0,sizeof(s[i])); } int len1=strlen(num1);//num1的长度 int len2=strlen(num2);//num2的长度 int line=0,list,k=1; //用num1中的各位数,乘以num2所有数,得到一个的二维数组,每一行存储其乘积,line即行,list即列 //通过竖式分析行数等于num1的长度,列的长度最多等于num1的长度加一 for(int i=len1-1; i>=0; i--)//从后往前,与num2的值相乘 { for(int j=len2-1,list=len2; j>=0; j--)//从后往前,将所有数与num1每个位上的数相乘 { int val=s[line][list]+(num1[i]-'0')*(num2[j]-'0');//得出二维数组进位得到的值加上每两个数相乘的结果 s[line][list--]=val%10+'0';//val的个位存于当前位置 s[line][list]+=val/10;//val的十位进位,存于下一位置 } s[line][0]+='0';//将最前端的一位数变为字符 for(int j=len2+1; j=0; i--)//因为最后一行已在res中,从倒数第二行开始,将所有行数的值加起来,就是答案 { int len3=len;//len3控制res当前位置 int j=strlen(s[i])-1;//j控制s二维数组当前行数的当前位置 while(j>=0) { https://leetcode-cn.com/problems/plus-one/ int val=res[len3]-'0'+s[i][j]-'0';//得到res和s[i]当前位置两数相加的值 res[len3--]=val%10+'0';//val的个位存入res的当前位置 res[len3]+=val/10;//val的十位进位,存入res的下一位置 j--;//直到s[i]的值都与res相加为止 } while(len3>0)//可能会出现要进位的情况,所以对后面的值,进行进位判断 { int val=res[len3]-'0'; res[len3--]=val%10+'0'; res[len3]+=val/10; } } if(res[0]=='0')//因为res的长度加了一位,来存储进位的情况,所以判断,res[0]是否有值,没有则返回下一个位置 return res+1; return res;}
简洁代码:
char * multiply(char * num1, char * num2){ if( num1[0] == '0' || num2[0] == '0') return "0"; int index1 = strlen(num1); int index2 = strlen(num2); int number = 0; int *s = (int *)malloc(sizeof(int)*(index1+index2)); for(int i = 0; i=0; i--) { if(s[i] >= 10) { s[i-1] += s[i]/10; s[i] %= 10; } } while(s[number] == 0) number++; char *res = (char *)malloc(sizeof(char)*(index1+index2-number+1)); int j; for( j = 0; number
总结
可以使用C++和JAVA的大数库
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月11日 20时07分20秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
idea 在Debug 模式中运行语句中函数的方法
2021-05-14
《朝花夕拾》金句摘抄(五)
2021-05-14
Boostrap技能点整理之【网格系统】
2021-05-14
新闻发布项目——业务逻辑层(UserService)
2021-05-14
hibernate正向生成数据库表以及配置——hibernate.cfg.xml
2021-05-14
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2021-05-14
java实现人脸识别源码【含测试效果图】——Dao层(IUserDao)
2021-05-14
使用ueditor实现多图片上传案例——前台数据层(Index.jsp)
2021-05-14
ssm(Spring+Spring mvc+mybatis)——saveDept.jsp
2021-05-14
JavaScript操作BOM对象
2021-05-14
解决Chrome播放视频闪屏黑屏无法播放
2021-05-14
Git简单理解与使用
2021-05-14
echarts 基本图表开发小结
2021-05-14
二分查找.基于有序数组的查找方法.704
2021-05-14
制作JS验证码(简易)
2021-05-14