题目: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的更多相关文章

  1. LeetCode 43. 字符串相乘(Multiply Strings)

    43. 字符串相乘 43. Multiply Strings 题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. ...

  2. [LeetCode] 大数问题,相加和相乘,题 Multiply Strings

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  3. LeetCode(43)Multiply Strings

    题目 Given two numbers represented as strings, return multiplication of the numbers as a string. Note: ...

  4. leetcode个人题解——#43 Multiply Strings

    思路:高精度乘法就可以了. 有两个错误以前没在意,1.成员属性定义时候不能进行初始化, vector<); 这样隐性调用了函数进行初始化的形式特别要注意,也是错误的: 2.容器类只有分配了空间时 ...

  5. LeetCode第[42]题(Java):Trapping Rain Water (数组方块盛水)——HARD

    题目:接雨水 难度:hard 题目内容: Given n non-negative integers representing an elevation map where the width of ...

  6. [LeetCode] 415 Add Strings && 67 Add Binary && 43 Multiply Strings

    这些题目是高精度加法和高精度乘法相关的,复习了一下就做了,没想到难住自己的是C++里面string的用法. 原题地址: 415 Add Strings:https://leetcode.com/pro ...

  7. 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) ...

  8. leetcode面试准备:Multiply Strings

    1 题目 Given two numbers represented as strings, return multiplication of the numbers as a string. Not ...

  9. [Leetcode][Python]43: Multiply Strings

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 43: Multiply Stringshttps://leetcode.co ...

随机推荐

  1. 数据同步DataX

    数据同步那些事儿(优化过程分享)   简介 很久之前就想写这篇文章了,主要是介绍一下我做数据同步的过程中遇到的一些有意思的内容,和提升效率的过程. 当前在数据处理的过程中,数据同步如同血液一般充满全过 ...

  2. Scan IP relocate/failover其它段后不能ping通过

    或手动集群重启单个节点srvctl relocate scan_listener后.群集网络段ping IP,VIP.SCAN IP正常.其他段ping SCAN IP 不通.其原因是,该路由ARP表 ...

  3. Git常用操作汇总(转)

    如果一个文件被删除了,可以使用切换版本号进行恢复.恢复方法: 先确定需要恢复的文件要恢复成哪一个历史版本(commit),假设那个版本号是: commit_id,那么 git checkout com ...

  4. Azure File Service in IIS

    微软Azure的Storage套件中提供了新的服务File Service,让我们运行在Azure中的程序都能共享存储,一个存储账号共享的没有上线,但每个共享的上限是5G.由于File Service ...

  5. 文件类似的推理 -- 超级本征值(super feature)

         基于内容的变长分块(CDC)技术,能够用来对文件进行变长分块.而后用来进行反复性检測,广泛用于去重系统中.后来又出现了对相似数据块进行delta压缩,进一步节省存储开销. 所以就须要一种高效 ...

  6. 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序。

    原文 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序. win7 64位操作系统上边运行IIS网站应用的时候,提示错误"试图加载格式 ...

  7. Linux对于录音

    一.原理简介 在Linux下,记录--从dsp读取数据.播放--至dsp设备写入数据. 开发板採用声卡UDA1341实现音频编解码,完毕A/D和D/A转换,芯片UDA1341与CPU的连接图例如以下: ...

  8. winform 实现选择的城市名单

    首先在地图上 #region 选择城市 /// <summary> /// 点击字母事件 /// </summary> /// <param name="sen ...

  9. 手工制作的年份Java老A发售量

    Java老A这本书是写了很长的时间,昨天终于开始china-pub.京东.活动当天发售的猫,现在,简称买卖,他当然还没有到. 有兴趣的人能够去看看哈(兴许其它站点地址也会在这里公开): china-p ...

  10. MAC使用小技巧(一)

    [ Mac OS X 终端命令开启功能 ] 1.Lion下显示资源库方法一:显示在“终端”中输入下面的命令:chflags nohidden ~/Library/ 隐藏在“终端”中输入下面的命令:ch ...