题目:

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.

代码:

class Solution {
public:
string multiply(string num1, string num2) {
const int n1 = num1.size(), n2 = num2.size();
if ( num1=="" || num2=="") return "";
vector<char> ret;
for ( int i=n1-; i>=; --i )
{
vector<char> local(,'');
int v = , carry = , curr = ;
for ( int j=n2-; j>=; --j )
{
v= (num1[i]-'')*(num2[j]-'');
carry = v/;
curr = v%;
carry += ((local[]-'')+curr)/;
curr = ((local[]-'')+curr)%;
local[] = curr+'';
local.insert(local.begin(), carry+'');
}
if (local[]=='') local.erase(local.begin());
// cout << string(local.begin(),local.end()) << endl;
// add zeros
for ( int z=n1-; z>i; --z) local.push_back('');
// cout << string(local.begin(),local.end()) << endl;
carry = , curr = ;
for ( int r=ret.size()-, l=local.size()-; r>= || l>=; --r,--l )
{
if ( r>= && l>= )
{
curr = (carry+(ret[r]-'')+(local[l]-''))%;
carry = (carry+(ret[r]-'')+(local[l]-''))/;
local[l] = curr+'';
}
else
{
curr = (carry+(local[l]-''))%;
carry = (carry+(local[l]-''))/;
local[l] = curr+'';
}
}
if (carry!=) { local.insert(local.begin(), carry+''); }
ret = local;
}
return string(ret.begin(),ret.end());
}
};

tips:

就是一些字符串操作的细节,考虑进位,0这类的细节。

======================================

第二次过这道题,憋了好久。主要是有个思维误区,认为tmp比ret最多多一位;但是,比如52*4这样的例子,2*4=8 50*4=200就不止一位了。

解决了这个误区,代码AC了。

class Solution {
public:
string multiply(string num1, string num2) {
if ( num1=="" || num2=="" ) return "";
vector<char> ret(num2.size(),'');
for ( int i=num1.size()-; i>=; --i )
{
// mupltiply ret
vector<int> tmp;
int val = , carry = ;
for ( int j=num2.size()-; j>=; --j )
{
val = (num2[j]-'')*(num1[i]-'')+carry;
tmp.insert(tmp.begin(), val%);
carry = val/;
}
if ( carry> ) tmp.insert(tmp.begin(), carry);
for ( int k=; k<num1.size()--i; ++k ) tmp.push_back();
// merge tmp & ret
while ( tmp.size()>ret.size() ) ret.insert(ret.begin(),'');
val = ;
carry = ;
for ( int m=tmp.size()-; m>=; --m )
{
val = (ret[m]-'') + tmp[m] + carry;
ret[m] = val%+'';
carry = val/;
}
if ( carry> ) ret.insert(ret.begin(), carry+'');
}
return string(ret.begin(), ret.end());
}
};

最新文章

  1. 关于spark的一些简单认识。
  2. AngularJS中实现无限级联动菜单(使用demo)
  3. git初体验(二)基础git文件操作
  4. [bzoj 3687]简单题 bitset的运用
  5. Qt标题栏图标和运行程序图标设置
  6. Spring+SpringMVC+MyBatis+easyUI整合
  7. C++并发高级接口:std::async和std::future
  8. PLSQL Developer使用技巧
  9. SQLServer2PostgreSQL迁移过程中的几个问题
  10. Vue(小案例_vue+axios仿手机app)_公共组件(路由组件传参)
  11. 挑选队友 (生成函数 + FFT + 分治)
  12. Libre OJ 130、131、132 (树状数组 单点修改、区间查询 -&gt; 区间修改,单点查询 -&gt; 区间修改,区间查询)
  13. Elasticsearch GC 时间过长的解决方法
  14. Fiddler抓取手机端(ios+android)APP接口数据(http+https)
  15. The project cannot be built until its prerequisite base-service is built. Cleaning and building all projects is recommended
  16. 胡思乱想 &amp; 胡言乱语
  17. mips32和x86下的大小端模式判定
  18. [UE4]目标是Pawn、Get Player Character
  19. filter 死循环(tomcat 启动完成 ,自动执行filter.dofilter,导致tomcat 启动超时) , tomcat 启动和 servers 启动 不同
  20. 重装Win7后找回Ubuntu启动项并在Ubuntu中修复引导

热门文章

  1. [转载]在VB.Net中获取COM对象的特定实例(Getting a specific instance of COM object in VB.Net)
  2. windows server 安装之后需要做的操作
  3. Oracle 日期加减运算
  4. WPF中TreeView单击展开其子元素以及点击一个元素展开其他元素收起
  5. Rxjava+retrofit+mvp整合
  6. 在Linux文件清空的几种方法
  7. 变量类型 ROWID 和 UROWID
  8. mysql基础,索引
  9. 路由器基础配置之单臂路由实现vlan间通信
  10. Java中的二进制运算出错问题