博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode - 43. Multiply Strings
阅读量:6220 次
发布时间:2019-06-21

本文共 2436 字,大约阅读时间需要 8 分钟。

43. Multiply Strings 

 ----------------------------------------------------------------------------

Mean: 

给定两个字符串,计算这两个字符串相乘的结果.

analyse:

模拟大数乘法.

Time complexity: O(N)

 

view code

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-03-06-17.13
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <windows.h>
#include <cstring>
using
namespace
std;
typedef
long
long(
LL);
typedef
unsigned
long
long(
ULL);
const
double
eps(
1e-8);
class
Solution
{
public
:
   
string
multiply(
string
num1
,
string
num2)
   
{
       
reverse(
num1
.
begin
(),
num1
.
end());
       
reverse(
num2
.
begin
(),
num2
.
end());
       
string
res
=
"0";
       
int
begin
=
0;
       
for(
int
i
=
0;
i
<
num2
.
length();
++
i)
       
{
           
string
temp_res;
           
str_num_multi(
num1
,
num2
[
i
]
-
'0'
,
temp_res);
           
add(
res
,
temp_res
,
begin);
           
begin
++;
       
}
       
reverse(
res
.
begin
(),
res
.
end());
       
// delete leader zero
       
while(
res
.
size()
>
0
&&
res
[
0
]
==
'0')
       
{
           
res
.
pop_back();
       
}
       
if(
res
.
size()
==
0)
res
.
push_back(
char(
'0'));
       
return
res;
   
}
   
void
str_num_multi(
string
str
,
int
num
,
string
&
res)
   
{
       
int
carry
=
0;
       
for(
int
i
=
0;
i
<
str
.
length();
++
i)
       
{
           
int
now
=
num
*(
str
[
i
]
-
'0')
+
carry;
           
carry
=
now
/
10;
           
now
%=
10;
           
res
.
push_back(
char(
now
+
'0'));
       
}
       
if(
carry)
           
res
.
push_back(
char(
carry
+
'0'));
   
}
   
void
add(
string
&
res
,
string
num
,
int
begin)
   
{
       
int
len
=
num
.
length
(),
carry
=
0
,
now;
       
for(
int
i
=
0;
i
<
len;
++
i)
       
{
           
if(
begin
<
res
.
size())
               
now
=(
res
[
begin
]
-
'0')
+(
num
[
i
]
-
'0')
+
carry;
           
else
now
=
carry
+(
num
[
i
]
-
'0');
           
carry
=
now
/
10;
           
now
%=
10;
           
if(
begin
>=
res
.
size())
               
res
.
push_back(
char(
now
+
'0'));
           
else
               
res
[
begin
]
=
now
+
'0';
           
++
begin;
       
}
       
while(
carry)
       
{
           
if(
begin
<
res
.
size())
               
now
=
carry
+(
res
[
begin
]
-
'0');
           
else
now
=
carry;
           
carry
=
now
/
10;
           
now
%=
10;
           
if(
begin
>=
res
.
size())
           
{
               
res
.
push_back(
char(
now
+
'0'));
           
}
           
else
               
res
[
begin
]
=
now
+
'0';
           
++
begin;
       
}
   
}
};
int
main()
{
   
string
s1
,
s2;
   
while(
cin
>>
s1
>>
s2)
   
{
       
Solution
solution;
       
string
ans
=
solution
.
multiply(
s1
,
s2);
       
cout
<<
ans
<<
endl;
   
}
   
return
0;
}
/*
*/

转载于:https://www.cnblogs.com/crazyacking/p/5248220.html

你可能感兴趣的文章
关于JS
查看>>
你得学会并且学得会的Socket编程基础知识(转)
查看>>
[Python]安装完pip、pygame后,仍然import pygame报错
查看>>
吃鸡蛋引发的血案,详解内存中的字节序
查看>>
【1139】数据结构上机测试2-2:单链表操作B (逆序建表+重复元素删除)
查看>>
C++ 内存管理之三(栈和堆)
查看>>
Windows7 64bit 安装python3.3 & cx_Freeze-4.3.2
查看>>
手写web服务器
查看>>
也谈 Python 的中文编码处理
查看>>
[LeetCode] LRU Cache
查看>>
OpenStack若干概念
查看>>
AttributeToElement
查看>>
php使用循环创建任意长度数组
查看>>
站立会议03
查看>>
POJ3068:"Shortest" pair of paths——题解
查看>>
上传本地文件到github(码云)上(小乌龟方式,sourcetree方式)
查看>>
微软Holographic将更名为Windows Mixed Reality
查看>>
豪情哥的忠告 能做到这一条就够用了
查看>>
精彩的javascript对象和数组混合相加
查看>>
Markdown介绍及工具推荐
查看>>