转载自:【方法1】【方法2】

public class DaShuXiangCheng {//*********************** 【方法1】 Start **************************************// 规模只要在这个范围内可以直接计算(整型数值满足)private final static int SIZE = 4;// 其中,len为X、Y的长度最大值private static String bigIntMultiply(String X, String Y, int len) {String str = "";if (len <= SIZE) { // 少于4位数,可直接计算return "" + (Integer.parseInt(X) * Integer.parseInt(Y));}if (X.length() != Y.length()) { // 长度不同,调用formatNumber方法,补齐X、Y,使之长度相同X = formatNumber(X, len);Y = formatNumber(Y, len);}// 将X、Y分别对半分成两部分int len1 = len / 2;int len2 = len - len1;String A = X.substring(0, len1);String B = X.substring(len1);String C = Y.substring(0, len1);String D = Y.substring(len1);// 乘法法则,分块处理int lenM = Math.max(len1, len2);String AC = bigIntMultiply(A, C, len1);String AD = bigIntMultiply(A, D, lenM);String BC = bigIntMultiply(B, C, lenM);String BD = bigIntMultiply(B, D, len2);// 注意处理进位的方法,巧妙地运用了字符串的拼接方面// 【1】 处理BD,得到原位及进位String[] sBD = dealString(BD, len2);// 【2】 处理AD + BC的和String ADBC = add(AD, BC);// 【3】 加上BD的进位if (!"0".equals(sBD[1])) {ADBC = add(ADBC, sBD[1]);}// 【4】 得到ADBC的进位String[] sADBC = dealString(ADBC, lenM);// 【5】 AC加上ADBC的进位AC = add(AC, sADBC[1]);// 【6】 最终结果str = AC + sADBC[0] + sBD[0];return str;}// 两个数字串按位加private static String add(String ad, String bc) {// 返回的结果String str = "";// 两字符串长度要相同int lenM = Math.max(ad.length(), bc.length());ad = formatNumber(ad, lenM);bc = formatNumber(bc, lenM);// 按位加,进位存储在flag中int flag = 0;// 按序从后往前按位求和for (int i = lenM - 1; i >= 0; i--) {int t = flag + Integer.parseInt(ad.substring(i, i + 1))+ Integer.parseInt(bc.substring(i, i + 1));// 结果超过9,则进位当前位,保留个位数if (t > 9) {flag = 1;t = t - 10;} else {flag = 0;}// 拼接结果字符串str = "" + t + str;}if (flag != 0) {str = "" + flag + str;}return str;}// 处理数字串,分离出进位,String数组第一个为原位数字,第二个为进位private static String[] dealString(String ac, int lenn) {String[] str = { ac, "0" };if (lenn < ac.length()) {int t = ac.length() - lenn;str[0] = ac.substring(t);str[1] = ac.substring(0, t);// System.out.println("+++++++++");// System.out.println(str[0]);// System.out.println(str[1]);// System.out.println(t);} else {// 保证结果length与lenn一致,少于则高位补0String result = str[0];for (int i = result.length(); i < lenn; i++) {result = "0" + result;}str[0] = result;}return str;}// 格式化操作的数字字符串,高位补零private static String formatNumber(String x, int len) {while (len > x.length()) {x = "0" + x;}return x;}//*********************** 【方法1】 End **************************************//*********************** 【方法2】 Start **************************************public static String multiply2(String num1, String num2){//把字符串转换成char数组char chars1[] = num1.toCharArray();char chars2[] = num2.toCharArray();//声明存放结果和两个乘积的容器int result[] = new int[chars1.length + chars2.length];int n1[] = new int[chars1.length];int n2[] = new int[chars2.length];//把char转换成int数组,为什么要减去一个'0'呢?因为要减去0的ascii码得到的就是实际的数字for(int i = 0; i < chars1.length;i++)n1[i] = chars1[i]-'0';for(int i = 0; i < chars2.length;i++)n2[i] = chars2[i]-'0';//逐个相乘,因为你会发现。AB*CD = AC(BC+AD)BD , 然后进位。for(int i =0 ; i < chars1.length; i++){for(int j =0; j < chars2.length; j++){result[i+j]+=n1[i]*n2[j];}}//满10进位,从后往前满十进位for(int i =result.length-1; i > 0 ;i--){result[i-1] += result[i] / 10;result[i] = result[i] % 10;}//转成string并返回String resultStr = "";for(int i = 0; i < result.length-1; i++){resultStr+=""+result[i];}return resultStr;}//*********************** 【方法2】 End **************************************public static void main(String[] args) {//String x = "38202212122222222222222222222222221111111111111111111111111111111111111111111111111114444444";//String y = "42204412121222222222222222222222225555555555555555555222222246666678921345643444657683512121";//System.out.println("bigIntMultiply("+x+", "+y+", "+Math.max(x.length(), y.length())+")");String x  = "";for(int i=1;i<100;i++){x += i;}String y = "";for(int i=99;i>0;i--){y += i;}System.out.println("x = "+x);System.out.println("y = "+y);Long fun1_dateStart = new Date().getTime();String result = bigIntMultiply(x, y, Math.max(x.length(), y.length()));Long fun1_dateEnd = new Date().getTime();System.out.println("方法1结果为  : "+result+"。 \r\n 用时 : "+(fun1_dateEnd - fun1_dateStart));//System.out.println(x+" * "+y+" = "+result);Long fun2_dateStart = new Date().getTime();String result2 = multiply2(x, y);Long fun2_dateEnd = new Date().getTime();System.out.println("方法2结果为  : "+result2+"。 \r\n 用时 : "+(fun2_dateEnd - fun2_dateStart));//System.out.println("multiply2("+x+", "+y+") = "+result2);}}

JAVA大数相乘实现方法相关推荐

  1. POJ 2389 Bull Math(水~Java -大数相乘)

    题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: 1 import java. ...

  2. c语言中大数相乘的方法,C++实现大数相乘算法

    本文实例为大家分享了C++实现大数相乘的具体代码,供大家参考,具体内容如下 首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘 ...

  3. 超大数相乘的java代码,java版大数相乘

    在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 用java搞了一个版本 这里说一下思路 将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次 ...

  4. 大数相乘、大数相加、大数相减Java版本

    为什么80%的码农都做不了架构师?>>>    题目:两个非常大的数字相乘(相加,相减) 该题目在java中可以使用BigInteger类中的方法来实现.否则的话可以使用如下方式来实 ...

  5. 大数相乘 java_大数相乘——java版

    之前面试的时候被问到两个很大很大的数相乘在java中怎么把它算出来,显然不能直接相乘,当时我只回答出来了用BigInteger,然而不是最好的答案.大数相乘的核心思想是将数字转化为字符串,然后逐位相乘 ...

  6. Java实现大数相乘

    大数相乘算法,可以避免因得数过大超过数据范围而显示错误的问题. 我所使用的大数相乘算法为逐位相乘处理进位法,主要运用了数组倒序和数组数组移动的方法. 大致原理为:如12345×678,先将12345和 ...

  7. Java黑皮书课后题第8章:**8.6(代数:两个矩阵相乘)编写两个矩阵相乘的方法。编写一个测试程序,提示用户输入两个3*3的矩阵,然后显示它们的乘积

    **8.6(代数:两个矩阵相乘)编写两个矩阵相乘的方法.编写一个测试程序,提示用户输入两个3*3的矩阵,然后显示它们的乘积 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 **8.6( ...

  8. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

  9. 【LeetCode43:字符串相乘(大数相乘)(Java实现)】

    字符串相乘(大数相乘) 一.题目描述 1.题目内容 2.样例 二.解决方案 1.算法流程 1)分析(竖式计算) 2)算法流程 2.Java实现 1)核心代码 2)完整测试代码 一.题目描述 1.题目内 ...

最新文章

  1. Boost:boost::atomic用法实例
  2. 7z001怎么解压在安卓手机上面_安卓手机能打开eif文件吗 手机怎么打开eip文件方法...
  3. mybatisplus新增返回主键_第17期:索引设计(主键设计)
  4. HR不会告诉你的薪资谈判技巧
  5. VS中出现 模块计算机类型“x86”与目标计算机类型“x64”冲突
  6. 水滴公司更新招股书:发行价区间为10-12美元
  7. java增删改查代码_低代码开发平台
  8. atlas 力矩计算_Atlas Copco基本拧紧技术
  9. 计算两个日期之间相差的天数(带带负数) 支持格式YYYY-mm-dd和YYYY-mm-dd HH:mm:ss...
  10. 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径
  11. Illustrator 教程,如何在 Illustrator 中描摹对象?
  12. maven安装Ojdbc6
  13. 数据安全分类分级剖析
  14. 很多IT从业者感觉到中国程序员前景一片灰暗,事实是如此吗?
  15. 无线上网认证之Portal认证
  16. w ndows7旗舰版怎么重装系统,windows7旗舰版64位重装系统图文教程
  17. GitHub clone: clone succeeded, but checked failed
  18. 微信小程序之收藏的实现2020-05-16
  19. 全国社会组织信用信息公式平台(试运行)爬虫记录
  20. socket 读、写字节流数据

热门文章

  1. OSChina 周三乱弹 ——程序员喜欢什么样的老婆
  2. 你真正思考过什么是架构吗?
  3. thinking in java 学习笔记 14 类型信息
  4. PD脚本导出到数据库后没有注释问题
  5. python boxplot_箱体图Boxplot及Python绘制方
  6. python boxplot用法_Python pandas.DataFrame.boxplot函数方法的使用
  7. 简单粗暴理解与实现机器学习之K-近邻算法(十):交叉验证,网格搜索(模型选择与调优)API、鸢尾花案例增加K值调优
  8. 用Python 制作微信全家福,这么神奇的吗?
  9. 【音视频第7天】mediasoup拥塞控制【未完待续】
  10. 校园文化建设计算机教室标语,学校标语:校园文化建设标语