每日算法之三十四:Multiply Strings
大数相乘,分别都是用字符串表示的两个大数。求相乘之后的结果表示。
首先我们应该考虑一下測试用例会有哪些,先准备測试用例对防御性编程会有比較大的帮助。可以考虑一些极端情况。有以下几种用例:
1)"0","0"
2)"0","879127346783" 当中一个是零
3)"as234","123343" 存在非法字符
4)"000000000000001234","2546" 存在零前缀。有冗余计算
大概就这么多吧。
要想实现大数乘法。必定先实现大数相加和一个大数和一个数字相乘。
这样大数相乘就行切割迭代计算。
以下是算法,自己写的。可能存在冗余。
<span style="font-size:14px;">class Solution {
public:
string subTwoString(string num1,string num2) //大数相加
{
string result = "";
int i = num1.length()-1;
int j = num2.length()-1;
int plus = 0;//进位
while(i>=0 && j>=0)
{
int temp = num1[i]-'0' + num2[j]-'0' + plus;//不能忘掉进位
result =char(temp%10+'0')+ result;
plus = temp/10;
i--;j--;
}
if(i>=0)//一种一个没有加完。不全结果,当然还有进位
{
while(i>=0)
{
int temp = num1[i]-'0' + plus;
result =char(temp%10+'0')+ result;
plus = temp/10;
i--;
}
}
if(j>=0)
{
while(j>=0)
{
int temp = num2[j]-'0' + plus;
result =char(temp%10+'0')+ result;
plus = temp/10;
j--;
}
}
if(plus != 0)//最后进位不为零是要在结果头部加上
result = char(plus+'0')+result;
return result;
}
string multi(string num1,int num)//大数和一位数字相乘
{
int len = num1.length()-1;
int plus = 0;
string result = "";
while(len>=0)
{
int temp = (num1[len] - '0') * num + plus;//plus刚開始是忘掉的,也不能写在括号内,跟加法不同
result = char(temp%10+'0') + result;
plus = temp/10;
len--;
}
if(plus != 0)
result = char(plus+'0') + result;
return result;}
string multiply(string num1, string num2) {//大数相乘
if(num1.length() == 0 || num2.length() ==0)
return 0;
if(num1 == "0"|| num2 == "0")
return "0";
string result = "";
int len1 = num1.length();
int len2 = num2.length();
for(int i = 0;i<len1;i++)
if(!isdigit(num1[i]))//是否存在数字
return 0;
for(int j = 0;j<len2;j++)
if(!isdigit(num2[j]))
return 0;
for(int k = len2-1;k>=0;k--)
{
string temp = multi(num1,num2[k]-'0');
for(int l = len2-k-1;l>0;l--)
temp = temp + "0";
result = subTwoString(result,temp);
}
return result;
}
};</span>
以下是还有一种方法。不是依照手算乘法计算的,使用了辅助数组利用特点写的:
思路:假设两个大数分别为m和n位,那么结果最多为m+n位,或者为m+n-1位(最后不存在进位)。比方123和23相乘。
0 | 0 | 3 | 6 | 9 |
0 | 2 | 4 | 6 | 0 |
0 | 2 | 7 | 12 | 9 |
0 | 2 | 8 | 2 | 9 |
以下做一下解释,第一行是123和3相乘的结果,第二行是2和123相乘的结果。
顺序前移了一位。第三行是把之前的计算结果相加。第四行是从后往前
求进位,知道最開始。
最后。再把他们转化成字符串就可以。
<span style="font-size:14px;">string multiply(string num1, string num2) {
if(num1=="0" || num2=="0") return "0";
int l1 = num1.length(), l2 = num2.length();
int* n1 = new int[l1];
int* n2 = new int[l2];
int* res = new int[l1+l2];
memset(res,0,sizeof(int)*(l1+l2));
for(int i=0; i<l1; ++i)
n1[i] = num1[i] - '0';
for(int i=0; i<l2; ++i)
n2[i] = num2[i] - '0';
for(int i=0; i<l1; ++i)
for (int j=0; j<l2; ++j)
res[i+j+1] += n1[i]*n2[j];
string ss = "";
for (int k=l1+l2-1; k>=0; --k){
if(k>0) res[k-1] += res[k]/10;
res[k] %= 10;
ss = char(res[k]+'0')+ss;
}
ss = ss[0]=='0'? ss.substr(1):ss;
//return ss.empty()?
"0":ss;
return ss;
}</span>
每日算法之三十四:Multiply Strings的更多相关文章
- 每日算法之三十八:Anagrams
Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...
- 每日算法之三十五:Wildcard Matching
模式匹配的实现,'?'代表单一字符,'*'代表随意多的字符.写代码实现两个字符串是否匹配. Implement wildcard pattern matching with support for ' ...
- 经典算法题每日演练——第十四题 Prim算法
原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
- VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
上一节讲了标签控件Tab Control以后,常用控件的内容就全部讲完了,当然并没有包括所有控件,主要是一些很常用很重要的控件.本节开始鸡啄米将为大家讲解菜单的概念及使用. 菜单简介 菜单在界面设计中 ...
- GUI学习之三十四——QSS样式表
今天是一个大课题:QSS样式表 一.概念: QSS是Qt Style Sheet——Qt样式表,是用来自定义控件外观的一种机制;可以把他类比成CSS,但是不及其功能强大. 二.使用: 我们做一个模板, ...
- OpenCV-Python 图像分割与Watershed算法 | 三十四
目标 在本章中, 我们将学习使用分水岭算法实现基于标记的图像分割 我们将看到:cv.watershed() 理论 任何灰度图像都可以看作是一个地形表面,其中高强度表示山峰,低强度表示山谷.你开始用不同 ...
- 爪哇国新游记之三十四----Dom4j的XPath操作
Dom4j是Java访问XML的利器之一,另一个是JDom.记得当年因为粗掌握点JDomAPI但项目要求使用Dom4j还闹一阵情绪,现在看来真是没必要,只花一些时间成本就进去一个新世界绝对是值得做的一 ...
- 每日算法之三十三:Trapping Rain Water
这是一个非常有意思的问题,求解最大容积问题,值得动脑筋想一想. 原题例如以下: Given n non-negative integers representing an elevation map ...
随机推荐
- ES6之字符串学习
以下是常用的方法不是全部方法 1.codePointAt()方法 有一些字段需要4个字节储存,这样charCodeAt方法的返回就是不正确的,用codePointAt()方法就可以返回 十进制的值.如 ...
- Quota- Linux必学的60个命令
1.作用 quota命令用来显示磁盘使用情况和限制情况,使用权限超级用户. 2.格式 quota [-g][-u][-v][-p] 用户名 组名 3.参数 -g:显示用户所在组的磁盘使用限制. -u: ...
- 前端在本地启动服务预览html页面
在开发移动端项目时浏览器里出来的效果往往到真机上和预想的有出入,在开发过程中知道了一个可以在本地自己启动一个服务器在手机预览的办法. 1.首先在终端安装http. npm i http-server ...
- 后缀数组(SA)及height数组
最近感觉自己越来越蒟蒻了--后缀数组不会,费用流不会-- 看着别人切一道又一道的题,我真是很无奈啊-- 然后,我花了好长时间,终于弄懂了后缀数组. 后缀数组是什么? 后缀SASASA数组 给你一个字符 ...
- [编织消息框架][netty源码分析]11 ByteBuf 实现类UnpooledHeapByteBuf职责与实现
每种ByteBuf都有相应的分配器ByteBufAllocator,类似工厂模式.我们先学习UnpooledHeapByteBuf与其对应的分配器UnpooledByteBufAllocator 如何 ...
- LUOGU P4074 [WC2013]糖果公园 (树上带修莫队)
传送门 解题思路 树上带修莫队,搞了两天..终于开O2+卡常大法贴边过了...bzoj上跑了183s..其实就是把树上莫队和带修莫队结合到一起,首先求出括号序,就是进一次出一次那种的,然后如果求两个点 ...
- vue.js_04_vue.js的for循环,if判断和show显示
1.for循环 <body> <div id="app"> <p>{{list1[0]}}</p> <hr /> < ...
- JS实现数据双向绑定
本文参考https://www.cnblogs.com/tianhaining/p/8425345.html 首先先说个面试题哈,就是vue中的v-model是如何实现双向数据绑定的咳咳,下面开始背诵 ...
- mysql基础教程(一)-----概述、安装、查询
概述 好处 •实现数据持久化 •使用完整的管理系统统一管理,易于查询 概念 DB 数据库(database):存储数据的“仓库”.它保存了一系列有组织的数据. DBMS 数据库管理系统(Databas ...
- [转] Linux 句柄是什么 ?
源地址:http://www.blogjava.net/shijian/archive/2012/04/06/373463.html 1.句柄就是一个标识符,只要获得对象的句柄,我们就可以对对象进行任 ...