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(); 相除取整
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’