Java大数相乘(使用BigInteger和BigDecimal以及使用数组实现大数相加)


1.BigInteger和BigDecimal

在 Java 中提供了用于大数字运算的类,即 java.math.BigInteger 类和 java.math.BigDecimal 类。这两个类用于高精度计算,其中 BigInteger 类是针对整型大数字的处理类,而 BigDecimal 类是针对大小数的处理类。

在运算中 BigInteger 类型可以准确地表示任何大小的整数值,它可以表示的范围比integer大得多了。
BigInteger类的常用运算方法:

add(BigInteger val)	做加法运算
subtract(BigInteger val)	做减法运算
multiply(BigInteger val)	做乘法运算
divide(BigInteger val)	做除法运算
remainder(BigInteger val)	做取余数运算
divideAndRemainder(BigInteger val)	做除法运算,返回数组的第一个值为商,第二个值为余数
pow(int exponent)	做参数的 exponent 次方运算
negate()	取相反数
shiftLeft(int n)	将数字左移 n 位,如果 n 为负数,则做右移操作
shiftRight(int n)	将数字右移 n 位,如果 n 为负数,则做左移操作
and(BigInteger val)	做与运算
or(BigInteger val)	做或运算
compareTo(BigInteger val)	做数字的比较运算
equals(Object obj)	当参数 obj 是 Biglnteger 类型的数字并且数值相等时返回 true, 其他返回 false
min(BigInteger val)	返回较小的数值
max(BigInteger val)	返回较大的数值

BigDecimal类可以精确的进行计算,在计算中由于浮点数float和double本身储存的关系不能做到完全的准确,因此在商业应用中BigDecimal可以提供精确得到小数计算。
资料:Java BigDecimal详解

2.大数相乘的题

在这里插入图片描述

import java.math.BigInteger;
import java.util.*;

class Main{
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
        BigInteger a =input.nextBigInteger();
        BigInteger b =input.nextBigInteger();
        long c = input.nextLong();
		BigInteger fin = a.multiply(b);
		BigInteger ten = new BigInteger("10");
		BigInteger zero = new BigInteger("0");
		int count = 0;
		while(fin.remainder(ten).equals(zero)) {
			count++;
			fin = fin.divide(ten);
		}
		if(count==c) {
			System.out.println("Well done!");
		}else {
			System.out.println("Doubt!");
		}
	}
}

3.数组实现大数相加

大数a+b(范围是1到10E200)

import java.util.*;

public class Main {
    public static void main(String[] args) {
    	Scanner input = new Scanner(System.in);
    	
    	int[] a = new int[202];
    	int[] b = new int[202];
    	int[] c = new int[202];
    	
    	String stra = input.next();
    	String strb = input.next();
    	
    	for(int i=0;i<stra.length();i++) {
    		a[i] = stra.charAt(stra.length()-1-i)-'0';
    	}
    	for(int i=0;i<strb.length();i++) {
    		b[i] = strb.charAt(strb.length()-1-i)-'0';
    	}
    	
    	int k=0,j=0;
    	for(int i=0;i<202;i++) {
    		k = a[i]+b[i]+j;
    		j = k/10;
    		c[i] = k%10;
    	}
    	
    	int t;//从后往前把数组里空的排除掉,找到开始有数的位置
    	for(int i=c.length-1;i>=0;i--) {
    		if(c[i]!=0) {
    			t=i;
    			break;
    		}
    	}
    	
		for(int i=t;i>=0;i--){
			System.out.print(c[i]);
		}
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值