java 中 如何sum 乘法_JAVA中解决大数乘法和加法问题

前言

在日常的算法练习中难免会遇见涉及阶乘的计算的题目,总所周知阶乘的数据会变得非常大,此时int和long型都装不下只能借助于String来表示,所以这里特为大家提供两种解决方案:1、使用Java API中的BigInteger类,该类中提供加(add())、减(subtract())、乘(multiply())、除(divid())的成员方法,我们可以通过这四种成员方法来进行我们的大整数运算。2、由于我们在计算中常用的是大整数加法和大整数乘法运算,所以我们可以自己构造相应的方法来实现我们的计算目的。

一、借助Java API---BigInteger类

示例程序如下

import java.math.BigInteger;

public class Main{

public static void main(String[] args) {

BigInteger bi1 = new BigInteger("123456789");//乘数1

BigInteger bi2 = new BigInteger("123456789");//乘数2

//public BigInteger add(BigInteger val):加

System.out.println("add:"+bi1.add(bi2));

//public BigInteger multiply(BigInteger val):乘

System.out.println("multiply:"+bi1.multiply(bi2));

}

}

二、构造大整数乘法和加法运算的方法

大整数加法运算方法

public static String add(String a,String b){

if(a.length() <= 8 && b.length() <= 8){

return Integer.parseInt(a) + Integer.parseInt(b) + "";

}

String a1 = "0";

String a2 = a;//低八位

if(a.length() > 8){

a1 = a.substring(0,a.length()-8);

a2 = a.substring(a.length()-8);

}

String b1 = "0";

String b2 = b;//低八位

if(b.length() > 8){

b1 = b.substring(0,b.length()-8);

b2 = b.substring(b.length()-8);

}

String t = add(a2,b2);//低八位相加和

if(t.length() > 8) return add(add(a1,b1),"1") + t.substring(1);

while(t.length() < 8) t = "0" + t;//低八位相加和不够八位时,在前面补零

return add(a1,b1) + t;

}

大整数乘法运算方法

public static String muti(String s1,String s2){

if(s1.length() <= 4 && s2.length() <= 4){//当两个乘数均小于4位时,直接计算就可以了

return Integer.parseInt(s1) * Integer.parseInt(s2) + "";

}

if(s1.length() > 4){//当s1位数超过4位时,将s1一分为二

int k = s1.length() / 2;//保存s1被分割位置的下表

String a1 = s1.substring(0,k);//s1的高位

String a2 = s1.substring(k);//s1的低位

return add(muti(a1,s2)+zero(a2.length()),muti(a2,s2));//高位与s2相乘在其后补上s2的长度个零在与低位与s2相乘的结果相加

}

return muti(s2,s1);//当s2的长度超过4时,将s2与s1的位置对调求解

}

注:补零算法zero(int k)实现代码如下

public static String zero(int k){

if(k == 0) return "";

if(k == 1) return "0";

int m = k / 2;

int n = k % 2;

return zero(m) + zero(m) + zero(n);//利用m + m + n = k

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值