leetcode 第42题 Multiply Strings
题目: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.
就是实现大数乘法。嘿嘿,我先用long long直接乘试试手感,试过了不行。所以还是要用字符串表示才行。
我是这样做的,先实现两个子函数,一个是实现一个数和一个字符串的数相乘的结果。另一个是实现两个字符串相加的结果。这样,大数乘法就可以由其中一个大数的每一位和另一个大数相乘然后再相加,就是要注意分解一个大数的时候记得要在结果后面加上零。例如12乘以3,我们把12分成1和2分别和3相乘,然后1和3相乘的后面要加一个零,因为1处于12的十位数。
oj上居然用了148ms。不忍直视啊。写了那么长。。。虽然Accept了
class Solution {
public:
string singleMulti(string s, char a) // 给定一个字符串和一个字符,返回乘积(字符串形式)
{
if (s.size() == )
return s;
if (a == '')
return "";
int c = a - '';
int up = ;
for (int i = s.size() - ; i > -; --i)
{
int tmp = s[i] - '';
int sum_now = up + c*tmp;
s[i] = sum_now% + '';
up = sum_now/;
}
if (up != )
{char tmp = up + '';
s = tmp + s;}
return s;
}
string sum42(string s1, string s2) // sum of two string
{
if (s1.size() == )
return s2;
if (s2.size() == )
return s1;
string s = s1;
int len1 = s1.size() - , len2 = s2.size() - , up = ;
while(len1 > - && len2 > -)
{
int n1 = s1[len1] - '';
int n2 = s2[len2] - '';
int n3 = n1 + n2 + up;
s[len1] = n3% + '';
up = n3/;
len1--;len2--;
}
while(len1 > -)
{
int n1 = s1[len1] - '';
int n3 = n1 + up;
s[len1] = n3% + '';
up = n3/;
len1--;
}
while(len2 > -)
{
int n2 = s2[len2] - '';
int n3 = n2 + up;
char tmp = n3% + '';
s = tmp + s;
up = n3/;
len2--;
}
if(up)
{
char tmp = up + '';
s = tmp + s;
}
return s;
}
string multiply(string num1, string num2)
{
if (num1 == "" || num2 == "")
return "";
int len1 = num1.size()-;
string s;
int cnt = ;
while(len1 > -)
{
string tmp = "";
int tn = cnt;
while(tn)
{
tmp = '' + tmp;
tn--;
}
s = sum42(s,singleMulti(num2, num1[len1])+ tmp);
len1--;
cnt++;
}
return s;
}
};
由于自己的代码那么长,所以也学习了下别人的,例如这里利用下面的图,很好理解。将图贴出:
我们以289*758为例

按照这个图我写了下代码(跟原版主略有不同):
class Solution {
public:
string multiply(string num1, string num2)
{
if (num1 == "" || num2 == "")
return "";
string s = "";
int len1 = num1.size(), len2 = num2.size();
vector<int> container(len1+len2, ); // 用来存表中红色部分值
for (int i = ; i < len1; ++i)
for (int j = ; j < len2; ++j)
{
container[i+j] += (num1[len1 - - i]-'')*(num2[len2 - - j]-''); // 注意标号
}
//处理进位
int up = , cnt = ;
while(cnt<len1+len2)
{
container[cnt] += up;
up = container[cnt]/;
container[cnt] %= ;
cnt++;
}
cnt--;
while(cnt > - && !container[cnt])//不应该有的零去掉
{
cnt--;
};
while(cnt > -) // 输出就是结果,注意方向被搞反了
{
char ch = container[cnt] + '';
s += ch;
cnt--;
}
return s;
}
};
这个主要是注意存的方向,不要把小标弄混淆了。输出的时候也要注意,别搞反了。低于60ms过。
leetcode 第42题 Multiply Strings的更多相关文章
- LeetCode 43. 字符串相乘(Multiply Strings)
43. 字符串相乘 43. Multiply Strings 题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. ...
- [LeetCode] 大数问题,相加和相乘,题 Multiply Strings
Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...
- LeetCode(43)Multiply Strings
题目 Given two numbers represented as strings, return multiplication of the numbers as a string. Note: ...
- leetcode个人题解——#43 Multiply Strings
思路:高精度乘法就可以了. 有两个错误以前没在意,1.成员属性定义时候不能进行初始化, vector<); 这样隐性调用了函数进行初始化的形式特别要注意,也是错误的: 2.容器类只有分配了空间时 ...
- LeetCode第[42]题(Java):Trapping Rain Water (数组方块盛水)——HARD
题目:接雨水 难度:hard 题目内容: Given n non-negative integers representing an elevation map where the width of ...
- [LeetCode] 415 Add Strings && 67 Add Binary && 43 Multiply Strings
这些题目是高精度加法和高精度乘法相关的,复习了一下就做了,没想到难住自己的是C++里面string的用法. 原题地址: 415 Add Strings:https://leetcode.com/pro ...
- LeetCode解题报告—— Combination Sum & Combination Sum II & Multiply Strings
1. Combination Sum Given a set of candidate numbers (C) (without duplicates) and a target number (T) ...
- leetcode面试准备:Multiply Strings
1 题目 Given two numbers represented as strings, return multiplication of the numbers as a string. Not ...
- [Leetcode][Python]43: Multiply Strings
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 43: Multiply Stringshttps://leetcode.co ...
随机推荐
- ORACLE安装心得,大家一起分享,假设不正确的地方,大家请指出来
1. 安装\Oracle\10201_database_win32.zip: a) 安装图解: http://jingyan.baidu.com/article/5d6edee228308899ead ...
- 关于java socket(转)
1. 关于new Socket()中参数的理解 Server端: 调用ServerSocket serverSocket = new ServerSocket(1287,2);后Server端打开了指 ...
- linux笔记本上安装了双显卡驱动(intel+nvidia)
为了提高linux图形性能并降低功耗,独特的文章. 我用的系统Fedora 20 Xfce x64,在安装驱动程序,以确保系统是最新的版本号. 最好安装gcc.kernel-devel和其他包.己主动 ...
- MYSQL-用户权限的验证过程(转)
知识点 因为MySQL是使用User和Host两个字段来确定用户身份的,这样就带来一个问题,就是一个客户端到底属于哪个host. 如果一个客户端同时匹配几个Host,对用户的确定将按照下面的优先级来排 ...
- Python标准库:内置函数format(value[, format_spec])
的值的函数value按format_spec的格式来格式化,然而函数解释format_spec是依据value的类型来决定的.不同的类型有不同的格式化解释. 当參数format_spec为空时,本函数 ...
- 手机号ID开关星号(*)
.h文件 <span style="font-size:18px;">/** * 转成星号工具 */ @interface AsteriskTool : NSObjec ...
- django 简易博客开发 1 安装、创建、配置、admin使用(转)
Django 自称是“最适合开发有限期的完美WEB框架”.本文参考<Django web开发指南>,快速搭建一个blog 出来,在中间涉及诸多知识点,这里不会详细说明,如果你是第一次接触D ...
- 页面加速Chromium 预压 Prerendering
前者已经推出了一个博客prefetch预加载的网页资源,以提高网页加载速度,下面我们一起来看一下,以加速网页chromium prerendering.介绍prerendering之前.先介绍两个概念 ...
- 使用reserve要再次避免不必要的分配
关于STL容器,最了不起的一点是,它们会自己主动增长以便容纳下你放入当中的数据,仅仅要没有超出它们的最大限制就能够.对于vector和string,增长过程是这样来实现的:每当须要很多其它空间时 ...
- hdu 1814 Peaceful Commission (2-sat 输出字典序最小的路径)
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...