在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);
}
}
}