题目: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. main真正的形状函数

    我们经常使用的像 int main()这种形式,但main长身体机能完全到底是什么样子? 以下这个main函数的形式可能有些出乎我们的意料: int main(int argc, char *argv ...

  2. 图解SSIS监视文件夹并自动导入数据

    原文:图解SSIS监视文件夹并自动导入数据 演示案例:让系统自动监视文件夹,并把文件夹下面的excel文件导入到sql中,之后清空目录.这个过程以往都需要写程序来实现或者定时执行,现在可以用ssis来 ...

  3. atittit.表单验证性质的原则和实施,以及选择和定义自己的兼容easyui dsl窗体身份验证规则

    atittit.表单验证性质的原则和实施,以及选择和定义自己的兼容easyui dsl规则的表单验证 1. 需求,表单验证须要弹框式,但眼下easyui ms绑定死了tooltip式样 1 2. 表单 ...

  4. windows(64位)下用vagrant+virtualbox 管理虚拟机具体解释

    windows下安装(64位) vagrant 跟 vituriebox http://blog.smdcn.net/article/1308.html Host: 127.0.0.1 Port: 2 ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览  ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ...

  6. suggest的使用方法

    suggest的使用方法注意: 1. 要表示汉语的"建议做某事",英语通经常使用suggest doing sth,而不能用 suggest to do sth: 2. " ...

  7. hdu 新生晚会

    Problem Description 开学了,杭电又迎来了好多新生.ACMer想为新生准备一个节目.来报名要表演节目的人很多,多达N个,但是只需要从这N个人中选M个就够了,一共有多少种选择方法?   ...

  8. Select与SelectMany的区别

    Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值. Select() 为每个源值生成一个结果值.因此,总体结果是一个与源集合具有相同元素数目的集合.与之相反,Se ...

  9. c#中 ==与equals有什么区别

    对于值类型.引用类型来说比较过程怎样的? using System;using System.Collections.Generic;using System.Text; namespace Cons ...

  10. oracle_常用命令(表空间查询)

    ---查询表空间 对应的物理文件,名称 ,大小 ,已用的,利用率 SELECT B.FILE_NAME "FILE_NAME", B.TABLESPACE_NAME "T ...