算法理解——大数相乘问题
来源:互联网 发布:关闭多台linux系统脚本 编辑:程序博客网 时间:2024/05/01 01:16
腾讯今年校招的一道附加题,就是“大数相乘”问题。所谓大数相乘,就是指数字比较大,相乘的结果超出了基本类型的表示范围,所以这样的数不能够直接做乘法运算。
其实乘法运算可以分拆为两步:第一步,是将乘数与被乘数逐位相乘;第二步,将逐位相乘得到的结果,对应相加起来。这有点类似小学数学中,计算乘法时通常采用的“竖式运算”。
这里唯一要注意的便是进位问题,我们可以先不考虑进位,当所有位对应相加,产生结果之后,再考虑如果该位的数字大于10,那么我们用取余运算,在该位上只保留取余运算的结果,而将进位(通过模运算得到)累加到下一位便可。
用java简单实现了这个算法,代码如下:
public class BigNumberMulti {public static void main(String[] args) {String num1Str = "24566";String num2Str = "452053";int[] num1 = new int[num1Str.length()];int[] num2 = new int[num2Str.length()];//将字符串转换为整数数组,注意,24566应转化成{6,6,5,4,2}for(int i = 0; i < num1Str.length();i++) {num1[num1Str.length() -1- i] = num1Str.charAt(i)-'0';}for(int i = 0; i < num2Str.length();i++) {num2[num2Str.length() -1- i] = num2Str.charAt(i)-'0';}int[] result = multiply(num1, num2);for(int i = result.length-1; i>=0;i--){System.out.print(result[i]);}}public static int[] multiply(int[] num1, int[] num2) {int lengthOfNum1 = num1.length;int lengthOfNum2 = num2.length;// 分配一个空间,用来存储运算的结果,n1长的数* n2长的数,结果不会超过n1+n2长int[] result = new int[lengthOfNum1 + lengthOfNum2];// 先不考虑进位问题,根据小学竖式的乘法运算,n1的第i位与n2的第j位相乘,结果应该存放在结果的第i+j位上for (int i = 0; i < lengthOfNum1; i++) {for (int j = 0; j < lengthOfNum2; j++) {result[i + j] += num1[i] * num2[j];}}// 单独处理进位问题for (int i = 0; i < lengthOfNum1 + lengthOfNum2 -1; i++) {if (result[i] > 10) {result[i + 1] += result[i] / 10;result[i] %= 10;}}return result;}}output:11105133998,经验证,与计算器得出的结果一致。
- 算法理解——大数相乘问题
- 算法理解之大数相乘问题
- 算法题-大数相乘问题
- 算法题-大数相乘问题
- 模板——大数相乘
- 大数相乘算法
- 大数相乘算法
- 大数相乘算法
- 大数相乘算法
- 大数相乘算法
- 大数相乘的算法
- 大数相乘算法
- 大数相乘算法
- 大数相乘算法
- 大数相乘算法
- 大数相乘算法
- 大数相乘算法
- 大数相乘算法
- 关于android几种常见的UI综合
- 数据库运维常用命令
- jQuery操作Select下拉框标签的一些方法和属性整理
- Android路径中提取文件名
- 客户端与服务器端通信方式总结
- 算法理解——大数相乘问题
- GWT工程架构分析与理解
- 开发笔记——ServletFileUpload
- { 二分答案 }soj2015
- mysql字符截取substring_index
- IMS学习中的一些名词解释
- J2EE综合—在项目过程中Struts常见错误的全面汇总
- POJ 1958 没有AC的版本
- C#Windows窗体界面设计_攻击决策项目_真实轨迹RealTrack