大数相乘 小咪咪 2022-08-19 15:12 184阅读 0赞 # [用分治法实现大数乘法,加法,减法(java实现)][java] # 大数乘法即多项式乘法问题,求A(x)与B(x)的乘积C(x),朴素解法的复杂度O(n^2),基本思想是把多项式A(x)与B(x)写成 A(x)=a\*x^m+b B(x)=c\*x^m+d 其中a,b,c,d为x的多项式。 则A(x)\*B(x)=(ac)\*x^2m+(ad+bc)\*x^m+bd 由ad+bc=(a+b)(c+d)-ac-bd 原来的4次乘法和1次加法由3次乘法和2次减法代替,减少了一次乘法操作。 用同样的方法应用到abcd的乘法上。 (以上内容摘自互联网) 以下为用java实现的代码: package com.kyy.sf; public class BigInteger { public BigInteger() { } // 基本思想是把多项式A(x)与B(x)写成 // A(x)=a*x^m+b // B(x)=c*x^m+d // 其中a,b,c,d为x的多项式。 // 则A(x)*B(x)=(ac)*x^2m+(ad+bc)*x^m+bd // 由ad+bc=(a+b)(c+d)-ac-bd // 字符串模拟乘法操作 public static String mut(String x, String y) { // deep++;// Console.WriteLine("-" + deep + "-"); String negative = ""; // x,y同为正或者同为负 if ((x.startsWith("-") && y.startsWith("-")) || (!x.startsWith("-") && !y.startsWith("-"))) { x = x.replaceAll("-", ""); y = y.replaceAll("-", ""); negative = ""; }// x,y一正一负 else if ((x.startsWith("-") && !y.startsWith("-")) || (!x.startsWith("-") && y.startsWith("-"))) { x = x.replace("-", ""); y = y.replace("-", ""); negative = "-"; } // 如果长度都等于于9,直接相乘,返回就行了。 if (x.length() == 1 && y.length() == 1) { // 计算乘积 int tmp = (Integer.parseInt(x) * Integer.parseInt(y)); if (tmp == 0) { return tmp + ""; } else { return negative + tmp; } } // 公式里的abcd String a, b, c, d; if (x.length() == 1) { a = "0"; b = x; } else { if (x.length() % 2 != 0) { x = "0" + x; } a = x.substring(0, x.length() / 2); b = x.substring(x.length() / 2); } if (y.length() == 1) { c = "0"; d = y; } else { if (y.length() % 2 != 0) { y = "0" + y; } c = y.substring(0, y.length() / 2); d = y.substring(y.length() / 2); } // 按最大位数取值,以确定补零数目 int n = x.length() >= y.length() ? x.length() : y.length(); String t1, t2, t3; // 递归调用,根据公式计算出值。 String ac = mut(a, c); String bd = mut(b, d); t1 = mut(sub(a, b), sub(d, c)); t2 = add(add(t1, ac), bd); t3 = add(add(Power10(ac, n), Power10(t2, n / 2)), bd).replaceAll("^0+", ""); if (t3 == "") return "0"; return negative + t3; } private static String add(String x, String y) { if (x.startsWith("-") && !y.startsWith("-")) { return sub(y, x.replaceAll("^-", "")); } else if (!x.startsWith("-") && y.startsWith("-")) { return sub(x, y.replaceAll("^-", "")); } else if (x.startsWith("-") && y.startsWith("-")) { return "-" + add(x.replaceAll("^-", ""), y.replaceAll("^-", "")); } if (x.length() > y.length()) { y = format(y, x.length(), "0"); } else { x = format(x, y.length(), "0"); } int[] sum = new int[x.length() + 1]; for (int i = x.length() - 1; i >= 0; i--) { int tmpsum = Integer.parseInt(x.charAt(i) + "") + Integer.parseInt(y.charAt(i) + "") + sum[i + 1]; if (tmpsum >= 10) { sum[i + 1] = tmpsum - 10; sum[i] = 1;// 表示进位 } else { sum[i + 1] = tmpsum; } } StringBuilder returnvalue = new StringBuilder(); for (int i : sum) { returnvalue.append(i); } if (sum[0] == 1) { return returnvalue.toString(); } else { return returnvalue.replace(0, 1, "").toString(); } } // 字符串模拟减法操作 private static String sub(String x, String y) { // x是正数,y也是正数 int flag = checkBigger(x, y); if (flag == 0) { return "0"; } else if (flag == -1) { String tmp = y; y = x; x = tmp; } // 保证了x>=y y = format(y, x.length(), "0");// y补0与x对齐 int[] difference = new int[x.length()]; for (int i = x.length() - 1; i >= 0; i--) { int tmpdifference; tmpdifference = Integer.parseInt(x.charAt(i) + "") - Integer.parseInt(y.charAt(i) + "") + difference[i]; if (tmpdifference < 0) { tmpdifference += 10; difference[i - 1] = -1;// 表示进位 } difference[i] = tmpdifference; } StringBuilder returnvalue = new StringBuilder(); for (int i : difference) { returnvalue.append(i); } String rv = returnvalue.toString().replaceAll("^0+", ""); if ("".equals(rv)) { return "0"; } if (flag == -1) { rv = "-" + rv; } return rv; } // 比较大小 private static int checkBigger(String x, String y) { if (x.length() > y.length()) { return 1; } else if (x.length() < y.length()) { return -1; } else { for (int i = 0; i < x.length(); i++) { if (x.charAt(i) > y.charAt(i)) { return 1; } else if (x.charAt(i) < y.charAt(i)) { return -1; } } return 0; } } //数据前补零 private static String format(String str, int len, String fu) { len = len - str.length(); for (int i = 0; i < len; i++) { str = fu + str; } return str; } // 模拟移位 public static String Power10(String num, int n) { for (int i = 0; i < n; i++) { num += "0"; } return num; } public static void main(String[] args) { String x = "93859048059849086850986804750894758903278473894578397598475984784857487584758094875890475984955624146039530798877974"; String y = "224343444859408590475847538946"; System.out.println(mut(x, y)); System.out.println(mut("1111111111", "1111111111")); } } From: http://www.cnblogs.com/kyyblabla/p/3412257.html [java]: http://www.cnblogs.com/kyyblabla/p/3412257.html
相关 大数相乘 void mul(string a, string b) { int max = 0; int c[1000] = {0}; in r囧r小猫/ 2022年12月04日 08:47/ 0 赞/ 21 阅读
相关 大数相乘 一、背景 最近在看算法的时候发现了一个问题,我们都知道方法的形参是要指定类型的,假如有以下方法 public int example(int a,int b){ 傷城~/ 2022年09月30日 13:55/ 0 赞/ 209 阅读
相关 大数相乘 参考地址:[http://www.cnblogs.com/heyonggang/p/3599857.html][http_www.cnblogs.com_heyonggang_ 悠悠/ 2022年08月20日 06:29/ 0 赞/ 189 阅读
相关 大数相乘 [用分治法实现大数乘法,加法,减法(java实现)][java] 大数乘法即多项式乘法问题,求A(x)与B(x)的乘积C(x),朴素解法的复杂度O 小咪咪/ 2022年08月19日 15:12/ 0 赞/ 185 阅读
相关 大数相乘 无意中看到一个华为面试题,使用代码计算[1234567891011121314151617181920\2019181716151413121110987654321][123 系统管理员/ 2022年08月11日 20:29/ 0 赞/ 194 阅读
相关 大数相乘 题目:请使用代码计算1234567891011121314151617181920\2019181716151413121110987654321。 答: ![复制代码][ Bertha 。/ 2022年08月05日 08:54/ 0 赞/ 205 阅读
相关 大数相乘 在这之前我们先来了解一下Java 中每种基本数据类型所占存储空间的大小。其中 1Byte = 8bit。 <table> <tbody> <tr> <th> 朱雀/ 2022年06月02日 02:36/ 0 赞/ 253 阅读
相关 大数相乘 设X和Y是n位的二进制整数,现在要计算X\Y的结果 将a和b分为两段,每段长均为总长的1/2, ![20180329214901958][] 拼搏现实的明天。/ 2022年05月28日 05:06/ 0 赞/ 215 阅读
相关 大数相乘 题目 编写两个任意位数的大数相乘的程序,给出计算结果。比如: > 题目描述: 输出两个不超过100位的大整数的乘积。 > 输入: 输入两个大整数,如1234567 今天药忘吃喽~/ 2022年05月23日 11:23/ 0 赞/ 336 阅读
相关 大数相乘 def fun(num1,num2): num1 type str num2 type str a = map(int, 落日映苍穹つ/ 2021年10月24日 01:48/ 0 赞/ 330 阅读
还没有评论,来说两句吧...