模板 - Java 高精度计算

Java 高精度计算模板

在用C或者C++处理大数时感觉非常麻烦,但是在JAVA中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数,只要计算机内存足够大。
这两个类都在java.math.*包中,因此每次必须在开头处引用该包。

Ⅰ基本函数:

1.valueOf(parament); 将参数转换为制定的类型

比如 int a=3;

BigInteger b=BigInteger.valueOf(a);
则b=3;
String s=”12345”;
BigInteger c=BigInteger.valueOf(s);

则c=12345;

2.add(); 大整数相加

BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);

a.add(b);

3.subtract(); 相减

4.multiply(); 相乘

5.divide(); 相除取整

扫描二维码关注公众号,回复: 824395 查看本文章

6.remainder(); 取余

7.pow(); a.pow(b)=a^b

8.gcd(); 最大公约数

9.abs(); 绝对值

10.negate(); 取反数

11.mod(); a.mod(b)=a%b=a.remainder(b);

12.max(); min();

13.public int compareTo();

14.boolean equals(); 是否相等

15.BigInteger构造函数:
一般用到以下两种:
BigInteger(String val);
将指定字符串转换为十进制表示形式;
BigInteger(String val,int radix);
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger

Ⅱ.基本常量:

A=BigInteger.ONE 1

B=BigInteger.TEN 10

C=BigInteger.ZERO 0

Ⅲ基本例题

例一

输入两个整数(很大)输出乘积

import java.util.Scanner;
import java.math.BigInteger;
public class Main {
    public static void main(String[] arge){
        Scanner cin=new Scanner(System.in);
        int T=cin.nextInt();
        for(int i=0;i<T;i++){
            BigInteger a=cin.nextBigInteger();
            BigInteger b=cin.nextBigInteger();
            BigInteger sum=a.multiply(b);;
            System.out.println(sum);
        }
    }
}

例二

输入 5

11 12 13 14 15

输出这些数的乘积

import java.util.Scanner;
import java.math.BigInteger;
public class Main {
    public static void main(String[] arge){
        Scanner cin=new Scanner(System.in);
        int T=cin.nextInt();
        BigInteger ans = new BigInteger("1");
        for(int i=0;i<T;i++){
            BigInteger a=cin.nextBigInteger();
            ans = ans.multiply(a);        
        }System.out.println(ans);
    }
}

例三

//输出格式

Case 1:

1 + 2 = 3

Case 2:

112233445566778899 + 998877665544332211 = 1111111111111111110

import java.util.Scanner;
import java.math.BigInteger;
public class Main {
    public static void main(String[] arge){
        Scanner cin=new Scanner(System.in);
        int T=cin.nextInt();
        BigInteger ans = new BigInteger("1");
        for(int i=0;i<T;i++){
            BigInteger a=cin.nextBigInteger();
            BigInteger b=cin.nextBigInteger();
            ans = a.add(b);   
            System.out.println("Case " + (i+1) + ":");      
            System.out.println(a + " + " + b + " = "+ ans);
            if (i != T-1) System.out.println(""); //打印空行
        }      
    }
}

例四

For each N, output N! in one line

EOF的用法

Sample Input

1
2
3

Sample Output

1
2
6
import java.util.Scanner;
import java.math.BigInteger;
public class Main{
    public static void main(String [] arge) {
        Scanner cin = new Scanner(System.in);
        BigInteger a[] = new BigInteger [10005]; //如此定义数组
        a[0] = BigInteger.valueOf(1);            //数组赋初值
        for (int i = 1;i <= 10000;i ++) {
            a[i] = a[i-1].multiply(BigInteger.valueOf(i)); //高精度类型转换
        }
        int n;
        while (cin.hasNextInt()) {  //判断有无输入,就是原来的EOF
            n = cin.nextInt();
            System.out.println(a[n]);
        }
    }
}

等于

        for(int i=0;i<T;i++){
            BigInteger ans = new BigInteger("0");
            while (true) {
                BigInteger a = cin.nextBigInteger();
                //if (a.equals(BigInteger.valueOf(0)))break;//等于的判断
                if(a.equals(BigInteger.ZERO)) break;
                ans = ans.add(a);
            }
            System.out.println(ans);
            if (i!=T-1) System.out.println("");
        }  

例五

要求输出a的n次方,a为小数,n为整数

并且前置0.中的0不要,后缀0也不要

:java小数经常会出现要取消科学记数法的情况,还会要去除后缀,前置零

import java.util.Scanner;
import java.math.BigDecimal;
import java.math.BigInteger;
public class Main{
    public static void main(String[] arge){
        Scanner cin=new Scanner(System.in);
        BigDecimal a;
        int n;
        while (cin.hasNextBigDecimal()) {
            a = cin.nextBigDecimal();
            n = cin.nextInt();
            BigDecimal ans = a.pow(n);
            ans = ans.stripTrailingZeros(); //去除小数点后,的后缀0
            String str = ans.toPlainString(); //将其转换为字符串,可以防止科学记数法的形式
            if(str.startsWith("0."))        //如果str是以"0."开头的
                str = str.substring(1);     //从第一位开始
            System.out.println(str);
        }
    }
}

例六

题目给两个大数字a,b 求出在区间 [a,b] 中的 斐波那契数的数量

import java.util.Scanner;
import java.math.BigDecimal;
import java.math.BigInteger;

public class Main {

    public static void main(String[] arge) {
        Scanner cin = new Scanner(System.in);
        BigInteger fi[] = new BigInteger [1000];
        fi[1] = fi[0] = BigInteger.ONE;
        for (int i = 2;i <= 999;i ++) {
            fi[i] = fi[i-1].add(fi[i-2]);
        }

        int ans = 0;
        BigInteger a,b;
        while (true) {
            a = cin.nextBigInteger();
            b = cin.nextBigInteger();
            if (a.equals(BigInteger.ZERO) && b.equals(BigInteger.ZERO)) break; 
            ans = 0;
            for (int i = 1;i <= 999;i ++) {
                if (a.compareTo(fi[i]) <= 0 && b.compareTo(fi[i]) >= 0) {
                    ans ++;//新比较函数,返回大小
                }
                if (b.compareTo(fi[i]) < 0)break;
            }
            System.out.println(ans);
        }
    }
}

例七

题目要求

输入一个小数(八进制),将其转换为一个十进制的小数

Sample Input

0.75
0.0001
0.01234567

Sample Output

0.75 [8] = 0.953125 [10]
0.0001 [8] = 0.000244140625 [10]
0.01234567 [8] = 0.020408093929290771484375 [10]
public static void main(String[] arge) {
        Scanner cin = new Scanner(System.in);
        BigDecimal a,b,c;
        String str;
        while (cin.hasNext()) {
            str = cin.nextLine();//这里用字符串来处理会比较方便
            BigDecimal n = BigDecimal.valueOf(8);
            a = BigDecimal.valueOf(0);
            int len = str.length();
            for (int i = 2;i < len;i ++) {
                c = new BigDecimal(str.charAt(i)-'0');//这个与C语言类似,直接-‘0’再进行类型转化
                a = a.add(c.divide(n));
                n = n.multiply(BigDecimal.valueOf(8));;
            }
            System.out.println(str + " [8] = " + a + " [10]");          
        }
    }

注意点

1.JAVA的nextlLine()与gets类似,在前一个nextInt输入后在使用一个nextline()读取’\n’

猜你喜欢

转载自blog.csdn.net/qq_41428565/article/details/80211938