转载自:【方法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. Spring OXM-XStream注解
  2. Android-----Activity生命周期
  3. html两方框重叠透明,html – 边缘浏览器向透明div添加重叠的“边缘”
  4. Codeforces Round #225 (Div. 1) E. Vowels 容斥 + sosdp
  5. python连接postgresql数据库
  6. 1304. 和为零的N个唯一整数
  7. Java虚拟机(五)——程序计数器
  8. python tcp多个客户端连接服务器
  9. [阅读记录]《新ABS_Guide_cn.txt》shell脚本的编写
  10. 01_合宙X-MagicBox-820_Air820UG(Cat.1+GNSS)简介
  11. linux学习(跟着b站尚硅谷老师学习)
  12. 绝无仅有!绝无仅有的史上最好shell替代工具
  13. mysql rds云数据库_云数据库 RDS MySQL快速入门手册
  14. asp.net之购物车
  15. 微生物恒化器中的进化压力----进化模型推导与分析
  16. 手撸Spring系列13:MyBatis(实战篇)
  17. 编程语言“破剑式”——编程语言学什么?
  18. JavaScript 双击禁止选中文字
  19. MFC设置坐标画曲线取点
  20. 机顶盒项目--遥控器组合键的实现

热门文章

  1. python3的fft_使用python进行FFT变换
  2. 刷脸支付市场谁才会是最后的大赢家
  3. Spring官方中文文档
  4. 码农飞升记-06-JDK多环境配置
  5. 【观察】浪潮QID平台落地重庆背后,打造工业互联网产业高地
  6. 通达信自带公式 阶段强于大盘(C124)
  7. 第二章 : 种子模块
  8. 重构传统与优化互联网并存,新产业与新业态共进,是一个主要方面
  9. python 中setattr()函数
  10. 按F1才能进系统怎么办?电脑开机需要按f1才能进入系统的解决办法