我不想学习了
不,我想!!
这篇博客作为我学习大数类的笔记。(我会持续更新的)
BigInteger操作大整数
BigDecimal指定小数的保留位数
首先,long的范围是:-2^63 ~ 2^63-1
超过这个范围,就是用大数类,最好用string字符串类型进行接收。
BigInteger常用基本方法
-
BigInteger(String value):
构造方法,将value字符串变成BigInteger类型数据。 -
加法 BigInteger add(BigInteger value)
-
减法 BigInteger subtract(BigInteger value)
-
乘法 BigInteger multiply(BigInteger value)
-
除法 BigInteger divide(BigInteger divisor)
-
取模 BigInteger modInverse(BigInteger m)
-
取余 BigInteger remainder(BigInteger divisor)
-
最大值 BigInteger max(BigInteger value)
返回两个大数中较大的一个 -
最小值 BigInteger min(BigInteger value)
-
最大公约数 BigInteger gcd(BigInteger value)
利用BigInteger构造方法转换进制
直接上代码
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
//十进制转二进制
String string10to2 = new BigInteger("20",10).toString(2);
System.out.println(string10to2);//20-->10100
//十进制转八进制
String string10to8 = new BigInteger("20",10).toString(8);
System.out.println(string10to8);//20-->24
//十进制转十六进制
String string10to16 = new BigInteger("20",10).toString(16);
System.out.println(string10to16);//20-->14
//二进制转十进制
String string2to10= new BigInteger("10100",2).toString(10);
System.out.println(string2to10);//10100-->20
//八进制转十进制
String string8to10 = new BigInteger("24",8).toString(10);
System.out.println(string8to10);//24-->20
//十六进制转十进制
String string16to10 = new BigInteger("14",16).toString(10);
System.out.println(string16to10);//14-->20
}
}
例题一:杭电1042(大数阶乘N!)
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
BigInteger ans;
Scanner sc=new Scanner(System.in);
int n;
while(sc.hasNext())/*表示你是否有输入数据,
while语句块 表示当你输入数据的时候,就执行输出sc.next()(输出内容)
所以只要你输入数据了,它就可以执行,
所以后台只是开了一块内存,一直未关闭,不算死循环
(只是检测,不执行输入)*/
{
n=sc.nextInt();
ans=BigInteger.valueOf(1);///大数类型不能直接赋值1
for(int i=1;i<=n;i++)
ans=ans.multiply(BigInteger.valueOf(i));
System.out.println(ans);
}
}
}
- sc.hasNext()相当于C语言里的!=EOF
例题二:杭电1750(大斐波那契)
import java.math.BigDecimal;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BigDecimal a[] = new BigDecimal [10005];
a[1]=a[2]=new BigDecimal(1);
//a[1]=a[2]=BigInteger.valueOf(1);
//两种赋值形式
for (int i = 3; i <10005 ; i++) {
a[i] = a[i-1].add(a[i-2]);
}
int t=sc.nextInt();
while(t!=0){
int n = sc.nextInt();
System.out.println(a[n]);
t--;
}
}
}
例题三:杭电1250(Hat写的斐波那契,注意:数组大小)
F(20) = 66526 has 5 digits
F(3000) has 855 digits
F(7100) has 2023 digits
题目要求2025位,所以数组起码得开7100
例题:杭电1865,5686一样(递推+大整数)
以下是BigDecimal
杭电:1063 浮点数的幂
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
BigDecimal a=sc.nextBigDecimal();
BigDecimal ans=BigDecimal.valueOf(1);
int n=sc.nextInt();
while(n-->0)
ans=ans.multiply(a);
String str = ans.stripTrailingZeros().toPlainString().toString();
/*去掉尾部的0;避免科学计数法*/
//String str=String.valueOf(ans);
if(str.startsWith("0."))
str=str.substring(1);
System.out.println(str);
}
}
}
-
.stripTrailingZeros().toPlainString().toString();
去掉尾部的0
避免科学计数法 -
.startsWith()
方法用于检测字符串是否以指定的前缀开始
回值:true false -
.substring(start,stop)
用于提取字符串中介于两个指定下标之间的字符
(stop可缺省,返回的子串会一直到字符串的结尾)