java大数乘法分治_用分治法实现大数乘法,加法,减法(java实现)

packagecom.kyy.sf;public classBigInteger {publicBigInteger() {

}//基本思想是把多项式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 staticString 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 staticString 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= newStringBuilder();for (inti : sum) {

returnvalue.append(i);

}if (sum[0] == 1) {returnreturnvalue.toString();

}else{return returnvalue.replace(0, 1, "").toString();

}

}//字符串模拟减法操作

private staticString 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--) {inttmpdifference;

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= newStringBuilder();for (inti : difference) {

returnvalue.append(i);

}

String rv= returnvalue.toString().replaceAll("^0+", "");if ("".equals(rv)) {return "0";

}if (flag == -1) {

rv= "-" +rv;

}returnrv;

}//比较大小

private static intcheckBigger(String x, String y) {if (x.length() >y.length()) {return 1;

}else if (x.length()

}else{for (int i = 0; i < x.length(); i++) {if (x.charAt(i) >y.charAt(i)) {return 1;

}else if (x.charAt(i)

}

}return 0;

}

}//数据前补零

private static String format(String str, intlen, String fu) {

len= len -str.length();for (int i = 0; i < len; i++) {

str= fu +str;

}returnstr;

}//模拟移位

public static String Power10(String num, intn) {for (int i = 0; i < n; i++) {

num+= "0";

}returnnum;

}public static voidmain(String[] args) {

String x= "93859048059849086850986804750894758903278473894578397598475984784857487584758094875890475984955624146039530798877974";

String y= "224343444859408590475847538946";

System.out.println(mut(x, y));

System.out.println(mut("1111111111", "1111111111"));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值