leetcode 43. Multiply Strings 字符串乘法
2017-09-03 15:39
537 查看
Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2.
Note:
The length of both num1 and num2 is < 110.
Both num1 and num2 contains only digits 0-9.
Both num1 and num2 does not contain any leading zero.
You must not use any built-in BigInteger library or convert the inputs to integer directly.
这道题考查的是大整数的乘法,禁止使用库函数,我这里是使用string的乘法,同时使用加法实现,比较慢,也比较烦。我个人而言不喜欢这样类型的题。
代码如下:
下面是C++的做法
代码如下:
Note:
The length of both num1 and num2 is < 110.
Both num1 and num2 contains only digits 0-9.
Both num1 and num2 does not contain any leading zero.
You must not use any built-in BigInteger library or convert the inputs to integer directly.
这道题考查的是大整数的乘法,禁止使用库函数,我这里是使用string的乘法,同时使用加法实现,比较慢,也比较烦。我个人而言不喜欢这样类型的题。
代码如下:
public class Solution { //这个其实考的是大整数的乘法,肯定会越界,所以必须使用String字符串 //因为涉及到了大量的String字符串处理,所以一定不要用String类型,否者会超时 //所以一定要用StringBuilder 做字符串处理 public String multiply(String num1, String num2) { if(num1==null || num1.length()<=0 ||num2==null || num2.length()<=0 ||num1.equals("0") || num2.equals("0") ) return "0"; if(num1.equals("1")) return num2; if(num2.equals("1")) return num1; //为了减少计算次数,我们使用短的数据num1去乘以num2 if(num2.length() < num1.length()) { String ss=num1; num1=num2; num2=ss; } String res="0"; //单位的乘法是通过加法实现的 for(int i=num1.length()-1;i>=0;i--) { String tmp=multiByChar(num2,num1.charAt(i)+"",num1.length()-1-i); res=addByChar(res,tmp); } return res; } //单位的字符串加法 private String addByChar(String res, String tmp) { //和之前的一样,使用短的加长的字符串 if(res.length()<tmp.length()) { String t=res; res=tmp; tmp=t; } //特殊情况处理 if(tmp.equals("0")) return res; int jinwei=0; int i,nowbit,sum; //必须要使用StringBuilder ,要不然太耗时了 StringBuilder finRes=new StringBuilder(); for(i=tmp.length()-1;i>=0;i--) { sum=getNum(tmp.charAt(i))+getNum(res.charAt(i+res.length()-tmp.length() ))+jinwei; nowbit=sum%10; jinwei=sum/10; finRes.append(nowbit); } for(i=res.length()-tmp.length()-1 ;i>=0;i--) { sum=getNum(res.charAt(i))+jinwei; nowbit=sum%10; jinwei=sum/10; finRes.append(nowbit); } //最后一位的处理 if(jinwei>0) finRes.append(jinwei); //做一个逆序处理 return new StringBuilder(finRes).reverse().toString(); } //单位的乘法实现 private String multiByChar(String num2, String one, int pow) { //特殊情况处理 int addTime=getNum(one.charAt(0)); if(addTime==0) 4000 return "0"; String res="0"; //乘法是通过加法实现 for(int i=0;i<addTime;i++) res=addByChar(res,num2); //添加不同为的幂次方 StringBuilder houzui=new StringBuilder(); for(int i=0;i<pow;i++) houzui.append("0"); //后缀0的处理 res+=houzui; return res; } //这个是把字符转化为数字 private int getNum(char a) { return (int)(a-'0'); } }
下面是C++的做法
代码如下:
class Solution { public: string multiply(string num1, string num2) { string res; int n1 = num1.size(), n2 = num2.size(); int k = n1 + n2 - 2, carry = 0; vector<int> v(n1 + n2, 0); for (int i = 0; i < n1; ++i) { for (int j = 0; j < n2; ++j) { v[k - i - j] += (num1[i] - '0') * (num2[j] - '0'); } } for (int i = 0; i < n1 + n2; ++i) { v[i] += carry; carry = v[i] / 10; v[i] %= 10; } int i = n1 + n2 - 1; while (v[i] == 0) --i; if (i < 0) return "0"; while (i >= 0) res.push_back(v[i--] + '0'); return res; } };
相关文章推荐
- LeetCode 43. Multiply Strings(字符串乘法)
- LeetCode-------43. Multiply Strings(字符串的乘法运算)
- leetcode_[python/C++逐步深入] 43. Multiply Strings_(大数乘法分析)
- LeetCode | 43. Multiply Strings(大整数乘法)
- LeetCode-Multiply Strings-字符串乘法-大整数-字符串操作
- Leetcode #43. Multiply Strings 字符串相乘 解题报告
- LeetCode 43. Multiply Strings(乘法)
- [LeetCode] 43. Multiply Strings 字符串相乘
- leetcode43. Multiply Strings
- LeetCode Multiply Strings 高精度乘法C++实现
- Leetcode-43. Multiply Strings
- [LeetCode] 583. Delete Operation for Two Strings 两个字符串的删除操作
- leetcode:Multiply Strings(字符串的乘法)【面试算法题】
- LeetCode:Isomorphic Strings(同构字符串)
- LeetCode 43. Multiply Strings
- [LeetCode] 555. Split Concatenated Strings 分割串联字符串
- leetcode 43. Multiply Strings
- leetcode---Multiply Strings---大整数乘法
- 43. Multiply Strings 字符串乘
- [LeetCode] 712. Minimum ASCII Delete Sum for Two Strings 两个字符串的最小ASCII删除和