大数相乘,分别都是用字符串表示的两个大数。求相乘之后的结果表示。

首先我们应该考虑一下測试用例会有哪些,先准备測试用例对防御性编程会有比較大的帮助。可以考虑一些极端情况。有以下几种用例:

1)"0","0"  

2)"0","879127346783" 当中一个是零

3)"as234","123343"  存在非法字符

4)"000000000000001234","2546"  存在零前缀。有冗余计算

大概就这么多吧。

要想实现大数乘法。必定先实现大数相加和一个大数和一个数字相乘。

这样大数相乘就行切割迭代计算。

以下是算法,自己写的。可能存在冗余。

  1. <span style="font-size:14px;">class Solution {
  2. public:
  3. string subTwoString(string num1,string num2) //大数相加
  4. {
  5. string result = "";
  6. int i = num1.length()-1;
  7. int j = num2.length()-1;
  8. int plus = 0;//进位
  9. while(i>=0 && j>=0)
  10. {
  11. int temp = num1[i]-'0' + num2[j]-'0' + plus;//不能忘掉进位
  12. result =char(temp%10+'0')+ result;
  13. plus = temp/10;
  14. i--;j--;
  15. }
  16. if(i>=0)//一种一个没有加完。不全结果,当然还有进位
  17. {
  18. while(i>=0)
  19. {
  20. int temp = num1[i]-'0' + plus;
  21. result =char(temp%10+'0')+ result;
  22. plus = temp/10;
  23. i--;
  24. }
  25. }
  26. if(j>=0)
  27. {
  28. while(j>=0)
  29. {
  30. int temp = num2[j]-'0' + plus;
  31. result =char(temp%10+'0')+ result;
  32. plus = temp/10;
  33. j--;
  34. }
  35. }
  36. if(plus != 0)//最后进位不为零是要在结果头部加上
  37. result = char(plus+'0')+result;
  38. return result;
  39. }
  40. string multi(string num1,int num)//大数和一位数字相乘
  41. {
  42. int len = num1.length()-1;
  43. int plus = 0;
  44. string result = "";
  45. while(len>=0)
  46. {
  47. int temp = (num1[len] - '0') * num + plus;//plus刚開始是忘掉的,也不能写在括号内,跟加法不同
  48. result = char(temp%10+'0') + result;
  49. plus = temp/10;
  50. len--;
  51. }
  52. if(plus != 0)
  53. result = char(plus+'0') + result;
  54. return result;}
  55. string multiply(string num1, string num2) {//大数相乘
  56. if(num1.length() == 0 || num2.length() ==0)
  57. return 0;
  58. if(num1 == "0"|| num2 == "0")
  59. return "0";
  60. string result = "";
  61. int len1 = num1.length();
  62. int len2 = num2.length();
  63. for(int i = 0;i<len1;i++)
  64. if(!isdigit(num1[i]))//是否存在数字
  65. return 0;
  66. for(int j = 0;j<len2;j++)
  67. if(!isdigit(num2[j]))
  68. return 0;
  69. for(int k = len2-1;k>=0;k--)
  70. {
  71. string temp = multi(num1,num2[k]-'0');
  72. for(int l = len2-k-1;l>0;l--)
  73. temp = temp + "0";
  74. result = subTwoString(result,temp);
  75. }
  76. return result;
  77. }
  78. };</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相乘的结果。

顺序前移了一位。第三行是把之前的计算结果相加。第四行是从后往前

求进位,知道最開始。

最后。再把他们转化成字符串就可以。

  1. <span style="font-size:14px;">string multiply(string num1, string num2) {
  2. if(num1=="0" || num2=="0") return "0";
  3. int l1 = num1.length(), l2 = num2.length();
  4. int* n1 = new int[l1];
  5. int* n2 = new int[l2];
  6. int* res = new int[l1+l2];
  7. memset(res,0,sizeof(int)*(l1+l2));
  8. for(int i=0; i<l1; ++i)
  9. n1[i] = num1[i] - '0';
  10. for(int i=0; i<l2; ++i)
  11. n2[i] = num2[i] - '0';
  12. for(int i=0; i<l1; ++i)
  13. for (int j=0; j<l2; ++j)
  14. res[i+j+1] += n1[i]*n2[j];
  15. string ss = "";
  16. for (int k=l1+l2-1; k>=0; --k){
  17. if(k>0) res[k-1] += res[k]/10;
  18. res[k] %= 10;
  19. ss = char(res[k]+'0')+ss;
  20. }
  21. ss = ss[0]=='0'? ss.substr(1):ss;
  22. //return ss.empty()?
  23. "0":ss;
  24. return ss;
  25. }</span>

每日算法之三十四:Multiply Strings的更多相关文章

  1. 每日算法之三十八:Anagrams

    Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...

  2. 每日算法之三十五:Wildcard Matching

    模式匹配的实现,'?'代表单一字符,'*'代表随意多的字符.写代码实现两个字符串是否匹配. Implement wildcard pattern matching with support for ' ...

  3. 经典算法题每日演练——第十四题 Prim算法

    原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...

  4. Java数据结构和算法(十四)——堆

    在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...

  5. VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)

    上一节讲了标签控件Tab Control以后,常用控件的内容就全部讲完了,当然并没有包括所有控件,主要是一些很常用很重要的控件.本节开始鸡啄米将为大家讲解菜单的概念及使用. 菜单简介 菜单在界面设计中 ...

  6. GUI学习之三十四——QSS样式表

    今天是一个大课题:QSS样式表 一.概念: QSS是Qt Style Sheet——Qt样式表,是用来自定义控件外观的一种机制;可以把他类比成CSS,但是不及其功能强大. 二.使用: 我们做一个模板, ...

  7. OpenCV-Python 图像分割与Watershed算法 | 三十四

    目标 在本章中, 我们将学习使用分水岭算法实现基于标记的图像分割 我们将看到:cv.watershed() 理论 任何灰度图像都可以看作是一个地形表面,其中高强度表示山峰,低强度表示山谷.你开始用不同 ...

  8. 爪哇国新游记之三十四----Dom4j的XPath操作

    Dom4j是Java访问XML的利器之一,另一个是JDom.记得当年因为粗掌握点JDomAPI但项目要求使用Dom4j还闹一阵情绪,现在看来真是没必要,只花一些时间成本就进去一个新世界绝对是值得做的一 ...

  9. 每日算法之三十三:Trapping Rain Water

    这是一个非常有意思的问题,求解最大容积问题,值得动脑筋想一想. 原题例如以下: Given n non-negative integers representing an elevation map ...

随机推荐

  1. 编程之法:面试和算法心得(字符串包含java实现)

    内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短.请问,如何最快地判断字符串B中所有字母是否都 ...

  2. List--使用List作为堆栈和队列

    1,List作为堆栈 堆栈“先进后出”.对此,可以使用append和pop来操作数据. 不指定下标时,pop会先操作最后一个数据. 例如: 2,队列 队列“先进先出”.当然也可以使用append和po ...

  3. 廖雪峰Java11多线程编程-1线程的概念-3线程的状态

    1线程的状态 线程终止的的原因: run()或call()方法执行完成,线程正常结束 线程抛出一个未捕获的Exception或Error 直接调用该线程的stop()方法来结束该线程--该方法容易导致 ...

  4. Python-流程控制 if判断

    目录 if 判断 语法 单分支结构 双分支结构 多分支结构 for循环 语法 for + break for + continue for + else range函数 for + if 练习 if ...

  5. exit()和return语句的区别

    (1)exit用于结束正在运行的程序,exit函数将参数是返回给OS.而return是返回函数值并退出函数. (2)return是语言级别的,它表示了调用堆栈的返回:而exit是系统调用级别的,它表示 ...

  6. 一键清理系统垃圾文件bat

    历史比较久远了,可做一定参考. @echo off echo 正在清理系统垃圾文件,请稍等...... del /f /s /q %systemdrive%*.tmp del /f /s /q %sy ...

  7. hive-hbase性能问题

    华为负责人本来想用这种表来做大数据开发,先前就听前辈讲过性能存在问题.实际开发过程确实存在不少问题.然后放弃换方案去做了. 1.底层meta映射字段问题.默认4000,如果再做修改会涉及到挺多源码. ...

  8. 2016年省赛 G Triple Nim

    2016年省赛 G Triple Nimnim游戏,要求开始局面为先手必败,也就是异或和为0.如果n为奇数,二进制下最后一位只有两种可能1,1,1和1,0,0,显然异或和为1,所以方案数为0如果n为偶 ...

  9. Javascript-简单的计时钟表

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  10. laravel--设置不需要csrfToken校验的接口

    一般是前后端分离或者支付宝响应的时候需要不设置csrfToken校验的接口,laravel推荐使用passport安全校验设计接口