Multiply Strings
2015-06-24 17:25
148 查看
算法题目:Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
大致意思:给定两个字符串数字num1,num2,数字可以无限大且非负,求这两个字符数的乘积,以string类型返回
解题思路:用一个长度为num1.size()+num2.size()的字符串ret保存结果,用一个carry数据记录各位上的进位,其长度为两个字符串数的长度和,且初始化为0,对应num1中的第i位上的数和num2上的第j 位数的乘积保存在ret的第i+j位上,最后对进位进行处理。
另外一种思路,根据乘法运算的步骤做的,计算量较大:
Note: The numbers can be arbitrarily large and are non-negative.
大致意思:给定两个字符串数字num1,num2,数字可以无限大且非负,求这两个字符数的乘积,以string类型返回
解题思路:用一个长度为num1.size()+num2.size()的字符串ret保存结果,用一个carry数据记录各位上的进位,其长度为两个字符串数的长度和,且初始化为0,对应num1中的第i位上的数和num2上的第j 位数的乘积保存在ret的第i+j位上,最后对进位进行处理。
string multiply(string num1, string num2) { if(num1.size()==0||num2.size()==0)return ""; else if(num1=="0"||num2=="0")return "0"; string ret(num1.size()+num2.size()-1,'0'); vector<int> carry(num1.size()+num2.size(),0); for(int i=0;i<num1.size();i++) { for(int j=0;j<num2.size();j++) { int sum=(num1[i]-'0')*(num2[j]-'0')+ret[i+j]-'0'; ret[i+j]=sum%10+'0'; carry[i+j]+=sum/10; } } for(int i=ret.size()-1;i>=0;i--) { int sum=ret[i]-'0'+carry[i+1]; ret[i]=sum%10+'0'; carry[i]+=sum/10; } return carry[0]>0?string(1,'0'+carry[0])+ret:ret; }
另外一种思路,根据乘法运算的步骤做的,计算量较大:
string AddCore(string& s1,string& s2,int c) { if(s1.size()==0&&s2.size()==0&&c==0)return ""; int ca=0,cb=0; string subs1=""; string subs2=""; if(s1.size()!=0) { subs1=s1.substr(0,s1.size()-1); ca=s1[s1.size()-1]-'0'; } if(s2.size()!=0) { subs2=s2.substr(0,s2.size()-1); cb=s2[s2.size()-1]-'0'; } int m=(ca+cb+c)%10; c=(ca+cb+c)/10; return AddCore(subs1,subs2,c)+string(1,m+'0'); } string StringAdd(string& s1,string& s2) { return AddCore(s1,s2,0); } string multiply(string num1, string num2) { if(num1.size()==0||num2.size()==0)return ""; else if(num1=="0"||num2=="0")return "0"; string ret=""; int zeronum=0; for(int i=num2.size()-1;i>=0;i--,zeronum++) { string s(num1.size(),'0'); int k=num2[i]-'0'; int c=0; for(int j=num1.size()-1;j>=0;j--) { int sum=(num1[j]-'0')*k+c; c=sum/10; s[j]=sum%10+'0'; } if(c>0)s=string(1,'0'+c)+s; for(int j=0;j<zeronum;j++) { s+='0'; } ret=StringAdd(s,ret); } return ret; }
相关文章推荐
- strings包学习
- xml中一些关于设置的细节(简单)
- strings和nm命令
- Android资源文件strings中写入“...”的方法
- Character String and Character String Array in C Programming
- Leetcode solution 02:205 Isomorphic Strings
- Algorithm: Multiply permutations in cycle form
- Algorithm: Multiply permutations in cycle form-2
- leetcode: Isomorphic Strings
- LeetCode205 Isomorphic Strings
- Multiply Strings leetcode 43
- IOS程序多语言本地化合理使用strings文件
- Multiply Strings
- 打开AD组策略编辑器提示“strings区段项目太长被截断”的解决 推荐
- grep 与strings配合查找二进制的方法
- golang strings包
- Redis基础教程第3节 Strings
- Misc(2)
- 43. Multiply Strings
- FusionCharts的使用方法