大整数乘法

本文转载自http://www.cnblogs.com/TenosDoIt/p/3735309.html
我们在日常的大整数计算中,通常是把它转化为字符型计算。这道题的思路就和我们小学计算乘法一样,
想乘的的结果,错位相加,最终进位,得到我们 的结果。


题干如下:

Given two non-negative integers num1 and num2 represented as strings,
return the product of num1 and num2.Note:The length of both num1 and num2 is < 110.Both num1 and num2 contains only digits 0-9.Both num1 and num2 does not contain any leading zero.You must not use any built-in BigInteger library or convert the inputs to integer directly.

思路很简单,实现有点绕:
这里引用了JustDoIT博客的内容,分析如下:

289*785为例:

首先我们把每一位相乘,得到一个没有进位的临时结果,如图中中间的一行红色数字就是临时结果,然后把临时结果从低位起依次进位。对于一个m位整数乘以n位整数的结果,最多只有m+n位。
注意:结果中需要去掉前导0,还需要注意结果为0的情况


代码如下:

class Solution {public:string multiply(string num1, string num2) {int s1 = num1.size();int s2 = num2.size();if(num1 == "0" || num2 == "0")return "0";int k = s1+s2-2;if(k <= 0){}vector<int>v(s1+s2,0);for(int i = 0; i<s1;i++) //未进位for(int j = 0;j<s2;j++){v[k-i-j]+=(num1[i]-'0')*(num2[j]-'0');}int carry = 0;for(int i = 0;i<s1+s2;i++){ //进位v[i]+=carry;carry = v[i]/10;v[i] = v[i]%10;}reverse(v.begin(),v.end());int u = 0;while(v[u] == 0)u++; //去掉前面的0string res = "";for(int i = u;i<v.size();i++)res+=v[i]+'0';return res;}
};

下面更新一个Java版本的:

class Solution {public String multiply(String num1, String num2) {int len1 = num1.length();int len2 = num2.length();int[] res = new int[len1+len2];int bit = 0;for(int i = len1-1; i>=0; i--){for(int j = len2-1; j>=0; j--){int ret = (num1.charAt(i)-'0') * (num2.charAt(j)-'0') + res[i+j+1];res[i+j] += ret / 10;res[i+j+1] = ret % 10;}}boolean flag = true;   // 去除前导0StringBuilder sb = new StringBuilder();for(int i = 0; i<res.length; i++){if(res[i] == 0 && flag){continue;}else{flag = false;sb.append(res[i]);}}return sb.length() == 0 ? "0" : sb.toString();}
}

大整数乘法--leetcode Multiply Strings相关推荐

  1. 【FFTNTT入门】大整数乘法

    问题:给定两个大整数 A A A 和 B B B, A A A 和 B B B 的长度为 n n n 和 m m m,求 A A A 和 B B B 的乘积 1. 朴素做法 思考小学数学中两个数的乘法 ...

  2. [LeetCode] Multiply Strings 解题报告

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

  3. 基于FFT的大整数乘法

    多项式求值 对于多项式f(x)=a0+a1∗x1+a2∗x2+...+an−1∗xn−1f(x)=a_{0}+a_{1}*x^{1}+a_{2}*x^{2}+...+a_{n-1}*x^{n-1}f( ...

  4. 使用快速傅里叶变换计算大整数乘法-代码

    在上一篇随笔"使用快速傅里叶变换计算大整数乘法"中,已经讲述了使用快速傅里叶变换计算大整数乘法的原理.在这一篇随笔中,我们就使用快速傅里叶变换来实现一个提供任意精度的算术运算的静态 ...

  5. 信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法

    [题目链接] ybt 1307:[例1.3]高精度乘法 ybt 1174:大整数乘法 OpenJudge NOI 1.13 09:大整数乘法 [题目考点] 1. 高精度 考察:高精乘高精 高精度计算讲 ...

  6. 计算机算法设计与分析 大整数乘法

    大整数乘法 问题描述 求两个不超过200位的非负整数的积. 输入形式 有两行,每行是一个不超过200位的非负整数,没有多余的前导0. 输出形式 一行,即相乘后的结果.结果里不能有多余的前导0,即如果结 ...

  7. Bailian2980 大整数乘法【大数】

    2980:大整数乘法 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积. 输入 有两行,每行是一个不超过200位的非负整数,没有多余的前导0. 输出 一 ...

  8. 分治法求解大整数乘法

    算法导论课作业:分治法求解大整数乘法 – 学号:20204227058 求解思想 ​ 实现大整数乘法的方法有许多种,其中我们最简单的方法就是小学里面教的竖式算法,这种方法在计算过程中数AAA需要和数B ...

  9. 大整数乘法c语言代码_大整数乘法

    大整数乘法和我们小学学过的乘法公式一样(如下图),就是按位相乘,两个数中的每一位彼此相乘,然后将相同列的结果加起来,最后统一处理进位即可. #include <iostream> #inc ...

最新文章

  1. 利用歌词插件 让WMP活起来
  2. 开课吧python视频百度云-做摄影2年,工资5000,兼职2W...
  3. java 8u111 8u112_JDK 8U112
  4. promo和promotion
  5. mysql outfile csv_sql-MySQL导出到outfile:CSV转义字符
  6. python执行Linux系统命令
  7. Qt4_Quit按键
  8. 数据库系统概念第六版
  9. 关于慧斯顿电桥的疑惑
  10. Computer:编程入门的简介相关的一些概念解释之详细攻略
  11. java程序的组织结构
  12. Android 监听wifi热点打开和关闭广播
  13. Visual Studio Code讲解(二) ssh远程操作电脑
  14. 360wifi: 手机锁屏360wifi掉线的解决方法
  15. PyCharm选择性忽略PEP8代码风格警告信息
  16. 网络安全基础课程知识点(1)
  17. mfc入门基础(四)对话框添加控件、创建对话框类和为对话框控件添加变量
  18. 同学们零基础入门学写代码的最佳途径之一哦
  19. 首师大附中科创教育平台 我的刷题记录 0324 99999999海岛帝国:运输资源
  20. 2021-2025年中国脚手架系统行业市场供需与战略研究报告

热门文章

  1. 又拍云,音视频CDN加速利器
  2. RsyncServer服务无法启动的解决方法
  3. 诸如fluke等网络测试仪的工作原理简介
  4. 【C语言期末实训】学生学籍管理系统
  5. spring中文参考手册-核心技术_ioc
  6. 自制时间比对函数处理 比对过去时间与当前时间相差多少年多少月多少周多少分 多少秒...
  7. C++ 连接数据库的入口和获取列数、数据
  8. CentOS 开机自启动配置方法
  9. perl 中部分正则表达式中匹配非空字符和正常使用字符
  10. 基于HAProxy的网站架构