【Java大数类】BigInteger和BigDecimal类的实用 + 【例题】

8 篇文章 0 订阅
3 篇文章 0 订阅

在ACM竞赛中,通常会遇到一些精度要求比较高、数值较大的数值进行运算,如果我们用C/C++那将会非常麻烦(用数组存每位上的数字、模拟加减乘除等等等等);如果我们实用了java中的BigInteger(处理整数)、BigDecimal(处理浮点数)那将会非常方便,所以我们在这篇博客引入JAVA大数类。

大数类被包含在数学头文件中,所以引用大数类首先要加上我们的数学头文件:

import java.math.*;

大数类的数字通常是用字符串形式存储的、所以声明一个大数类,应该这样声明:

BigInteger a = new BigInteger("123456");	//参数是字符串
BigInteger b = new BigInteger("789");        //初始化
BigInteger C;    //没有初始化、直接声明

大数类的四则运算:

C = a.add(b);		// 加
System.out.println(C);
		
C = a.subtract(b);	// 减
System.out.println(C);
		
C = a.divide(b);	// 除
System.out.println(C);
		
C = a.multiply(b);	// 乘
System.out.println(C);

大数类数值判断:

boolean flag=a.equals(b);	//相等判断 相等返回true,反之返回false
System.out.println(flag);
		
int ans=a.compareTo(b);		//a<b返回-1  a==b返回0  a>b返回1
System.out.println(ans);

大数类常用方法:

C = a.mod(b);		//求余
System.out.println(C);
		
C = a.gcd(b);		//求最大公约数
System.out.println(C);
		
C = a.max(b);		//求最大值
System.out.println(C);
		
C = a.min(b);		//求最小值
System.out.println(C);

求大数类的位数:

//求大数的位数  先转换为字符串、再求长度
int ans = a.toString().length();
System.out.println(ans);

大数类输入框架:

import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
	public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
            while(cin.hasNext()) {			//等同于!=EOF
	            BigInteger num;
	            num = cin.nextBigInteger();
	            System.out.println(num);
            }
        }
}

大数类例题:

HDU 1002 A + B Problem II 【传送门】

(C/C++实现)友情链接:https://blog.csdn.net/lesileqin/article/details/84504681

AC代码:(友情提示:注意输出格式

import java.io.*;
import java.util.*;
import java.math.*;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int cnt=0,t;
		t=cin.nextInt();
		while((t--)>0) {		
			BigInteger a,b;
			BigInteger sum;
			a = cin.nextBigInteger();
			b = cin.nextBigInteger();
			sum = a.add(b);
			if(cnt>0)
				System.out.println();
			System.out.println("Case "+(++cnt)+":");
			System.out.println(a + " + " + b + " = " + sum);
		}
	}
}

HDU 1001 Sum Problem 【传送门】

AC代码:

import java.io.*;
import java.util.*;
import java.math.*;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		while(cin.hasNext()) {
			BigInteger a;
			BigInteger sum = new BigInteger("0");
			BigInteger temp = new BigInteger("1");
			BigInteger tmp = new BigInteger("1");
			a = cin.nextBigInteger();
			while(!temp.equals(a)) {
				sum=sum.add(temp);
				temp=temp.add(tmp);
			}
			sum=sum.add(a);
			System.out.println(sum);
			System.out.println();
		}
	}
}

HDU 2054 A == B ? 【传送门】

AC代码:

import java.io.*;
import java.util.*;
import java.math.*;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		while(cin.hasNext()) {
			BigDecimal a;
			BigDecimal b;
			a = cin.nextBigDecimal();
			b = cin.nextBigDecimal();
			if(a.compareTo(b)==0)
				System.out.println("YES");
			else
				System.out.println("NO");
		}
	}
}

HDU 1250 Hat's Fibonacci 【传送门】

(C/C++实现)友情链接:https://blog.csdn.net/lesileqin/article/details/84593670

AC代码:

import java.io.*;
import java.util.*;
import java.math.*;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);		
		BigInteger[] nums = new BigInteger[10010];
		nums[1] = new BigInteger("1");
		nums[2] = new BigInteger("1");
		nums[3] = new BigInteger("1");
		nums[4] = new BigInteger("1");
		for(int i = 5; i < 10010; i++) {
			nums[i] = nums[i - 1].add(nums[i - 2]);
			nums[i] = nums[i].add(nums[i-3]);
			nums[i] = nums[i].add(nums[i-4]);
		}
		while(cin.hasNext())
		{
			int n = cin.nextInt();
			System.out.println(nums[n]);
		}
	}
}

HDU 1576 A/B 【传送门】

AC代码:

import java.io.*;
import java.util.*;
import java.math.*;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);		
		int t;
		t = cin.nextInt();
		while((t--)>0) {
			BigInteger MOD = new BigInteger("9973");
			BigInteger b,n;
			n=cin.nextBigInteger();
			b=cin.nextBigInteger();
			for(BigInteger i = new BigInteger("1"); ;i=i.add(new BigInteger("1"))) {
				BigInteger a;
				a=b.multiply(i);
				if(a.mod(MOD).compareTo(n)==0)
				{
					a=a.divide(b);
					a=a.mod(MOD);
					System.out.println(a);
					break;
				}
			}
		}
	}
}

POJ 1001 Exponentiation 【传送门】

转字符串、运用stripTrailingZeros方法去除后缀“0”、判断startswith("0")去除前导“0”…… 

AC代码:

import java.io.*;
import java.util.*;
import java.math.*;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);		
		while(cin.hasNext()) {
			BigDecimal R;
			int n;
			R=cin.nextBigDecimal();
			n=cin.nextInt();
			String sum=R.pow(n).stripTrailingZeros().toPlainString();
			if(sum.startsWith("0")) {
				sum=sum.substring(1);
			}
			System.out.println(sum);
		}
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值