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的大数库

上一篇:LeetCode415.66.2 字符串相加问题
下一篇:LeetCode1,167 两数之和 I,II(uthash.h)

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年04月11日 20时07分20秒