攻克java大数类

我不想学习了
不,我想!!

这篇博客作为我学习大数类的笔记。(我会持续更新的)

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可缺省,返回的子串会一直到字符串的结尾)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值