使用java处理高精度计算

如果使用C++进行大数运算,需要使用数组模拟计算过程,如果涉及到加减乘除甚至乘方,问题就变得相当麻烦,为了避免这些不必要的麻烦,可以使用java的BigInteger类或者Python来处理,在这里使用java

  • java处理高精度计算只需要注意一点,就是熟悉BigInteger类的使用方法,其余问题都在于题目本身

例题

hdu1047 大数加法

  • 这个题需要把输入弄明白,他是通过0的个数来确定数据组数的
import java.math.BigInteger;
import java.util.*;
public class Main {
    
    
    public static void main(String[] args){
    
    
        Scanner input = new Scanner(System.in);
        int k = 0;
        int n = input.nextInt();
        BigInteger ans = BigInteger.ZERO;
        while(k < n){
    
    
            BigInteger m = input.nextBigInteger();
            if(m.compareTo(BigInteger.ZERO) == 0){
    
    
                if(k != 0) System.out.println();
                System.out.println(ans);
                k++;
                ans = BigInteger.ZERO;
            }else{
    
    
                ans = ans.add(m);
            }
        }
    }
}

hdu1042 大数阶乘

import java.math.BigInteger;
import java.util.*;
public class Main {
    
    
    public static void main(String[] args){
    
    
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
    
    
            int n = input.nextInt();
            BigInteger ans = BigInteger.ONE;
            for(int i=2;i<=n;i++){
    
    
                ans = ans.multiply(BigInteger.valueOf(i));
            }
            System.out.println(ans);
        }
    }
}

大数的数组存储

  • 通过本题可以掌握如何开大数数组、大数赋值方法、大数比较方法
  • 注意题目里fibonacci的起始值
import java.math.BigInteger;
import java.util.*;
public class Main {
    
    
    public static void main(String[] args){
    
    
        Scanner input = new Scanner(System.in);
        BigInteger a, b;
        BigInteger[] Data = new BigInteger[1500];
        Data[1] = new BigInteger("1");
        Data[2] = new BigInteger("2");
        for(int i=3;i<=1200;i++){
    
    
            Data[i] = Data[i - 1].add(Data[i - 2]);
        }
        while(true){
    
    
            int ans = 0;
            a = input.nextBigInteger();
            b = input.nextBigInteger();
            if((a.compareTo(BigInteger.ZERO) == 0 &&
                    b.compareTo(BigInteger.ZERO) == 0)){
    
    
                break;
            }else{
    
    
                for(int i=1;i<=1200;i++){
    
    
                    if((a.compareTo(Data[i]) <= 0 &&
                            b.compareTo(Data[i]) >= 0))
                        ans++;
                }
            }
            System.out.println(ans);
        }
    }
}

大数乘方

  • 这个题用到BigDecimal方法,前导0和后缀0的问题在这道题里面体现的淋漓尽致,String的charAt方法判断整数位是不是0,stripTrailingZeros去后缀0,toPlainString去科学计数法,转换浮点数为字符串
import java.math.BigDecimal;
import java.math.BigInteger;
import java.lang.String;
import java.util.*;
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
    
    
            BigDecimal base = input.nextBigDecimal();
            int power = input.nextInt();
            String s = base.pow(power).stripTrailingZeros().toPlainString();
            if(s.charAt(0) == '0') s = s.substring(1);
            System.out.println(s);
        }
    }
}

参考博客

https://blog.csdn.net/weixin_44259720/article/details/87002816

猜你喜欢

转载自blog.csdn.net/roadtohacker/article/details/113438716