1、定义一个大浮点数
BigDecimal a=BigDecimal.valueOf(1.0);
BigDecimal b=BigDecimal.valueOf(1.000);
2、BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值!
在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类
Ⅰ基本函数:
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.punlic int comareTo();
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
Ⅲ.基本操作
1. 读入:
用Scanner类定义对象进行控制台读入,Scanner类在java.util.*包中
Scanner cin=new Scanner(System.in);// 读入
while(cin.hasNext()){ // 等同于!=EOF
int n;
BigInteger m;
n = cin.nextInt(); // 读入一个int;
m = cin.BigInteger();// 读入一个BigInteger;
System.out.print(m.toString());
}
System.out.println(a.toString());
//返回大整数p进制的字符串表示
int p=8;
System.out.println(a.toString(p));
格式:
1. import java.text.DecimalFormat;
2.
3. public classTestNumberFormat{
4.
5. public staticvoidmain(String[]args){
6. doublepi=3.1415927; //圆周率
7. //取一位整数
8. System.out.println(newDecimalFormat("0").format(pi)); //3
9. //取一位整数和两位小数
10. System.out.println(newDecimalFormat("0.00").format(pi)); //3.14
11. //取两位整数和三位小数,整数不足部分以0填补。
12. System.out.println(new DecimalFormat("00.000").format(pi));// 03.142
13. //取所有整数部分
14. System.out.println(newDecimalFormat("#").format(pi)); //3
15. //以百分比方式计数,并取两位小数
16. System.out.println(new DecimalFormat("#.##%").format(pi)); //314.16%
17.
18. longc=299792458; //光速
19. //显示为科学计数法,并取五位小数
20. System.out.println(newDecimalFormat("#.#####E0").format(c)); //2.99792E8
21. //显示为两位整数的科学计数法,并取四位小数
22. System.out.println(newDecimalFormat("00.####E0").format(c)); //29.9792E7
23. //每三位以逗号进行分隔。
24. System.out.println(newDecimalFormat(",###").format(c)); //299,792,458
25. //将格式嵌入文本
26. System.out.println(newDecimalFormat("光速大小为每秒,###米。").format(c));
27. }
28. }
DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。上面的例子包含了差不多所有的基本用法,如果你想了解更多,请参考 DecimalFormat 类的文档。
1、大数阶乘
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=28
1. import java.io.*;
2. import java.math.BigInteger;
3. import java.util.*;
4.
5. public class Main
6. {
7. public static void main(String args[])
8. {
9. Scanner cin = new Scanner(System.in);
10. int n = cin.nextInt();
11. BigInteger ans = BigInteger.ONE;
12. for(int i = 1; i <= n; ++i)
13. ans = ans.multiply(BigInteger.valueOf(i));
14. System.out.println(ans);
15. }
16. }
17.
2、大数比较(整数)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=73
1. import java.io.*;
2. import java.math.BigInteger;
3. import java.util.*;
4.
5. public class Main
6. {
7. public static void main(String args[])
8. {
9. Scanner cin = new Scanner(System.in);
10. while(cin.hasNext())
11. {
12. BigInteger a = cin.nextBigInteger();
13. BigInteger b = cin.nextBigInteger();
14. if(a.equals(BigInteger.ZERO) && b.equals(BigInteger.ZERO))
15. break;
16. int flag = a.compareTo(b);
17. if(flag == -1)
18. System.out.println("a<b");
19. else if(flag == 0)
20. System.out.println("a==b");
21. else
22. System.out.println("a>b");
23. }
24. }
25. }
3、大数四则运算
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=103
大数加法:
1. import java.math.BigInteger;
2. import java.util.*;
3. import java.io.*;
4.
5. public class Main
6. {
7. public static void main(String args[])
8. {
9. Scanner in = new Scanner(System.in);
10. int n = in.nextInt();
11. for(int i = 1; i <= n; ++i)
12. {
13. BigInteger a = in.nextBigInteger();
14. BigInteger b = in.nextBigInteger();
15. BigInteger ans = a.add(b);
16. System.out.println("Case " + i + ":");
17. System.out.println(a + " + " + b + " = " +ans);
18. }
19. }
20. }
四则预算:
1. import java.util.Scanner;
2. import java.math.*;
3. import java.text.*;
4.
5. public class Main {
6. public static void main(String args[]) {
7. Scanner cin = new Scanner(System.in);
8. BigInteger a, b;
9. int c;
10. char op;
11. String s;
12. while (cin.hasNext()) {
13. a = cin.nextBigInteger();
14. s = cin.next();
15. op = s.charAt(0);
16. if (op == '+') {
17. b = cin.nextBigInteger();
18. System.out.println(a.add(b));
19. } else if (op == '-') {
20. b = cin.nextBigInteger();
21. System.out.println(a.subtract(b));
22. } else if (op == '*') {
23. b = cin.nextBigInteger();
24. System.out.println(a.multiply(b));
25. } else {
26. BigDecimal a1, b1, eps;
27. String s1, s2, temp;
28. s1 = a.toString();
29. a1 = new BigDecimal(s1);
30. b = cin.nextBigInteger();
31. s2 = b.toString();
32. b1 = new BigDecimal(s2);
33. c = cin.nextInt();
34. eps = a1.divide(b1, c, 4);
35. // System.out.println(a + " " + b + " " + c);
36. // System.out.println(a1.doubleValue() + " " + b1.doubleValue()
37. // + " " + c);
38. System.out.print(a.divide(b) + " " + a.mod(b) + " ");
39. if (c != 0) {
40. temp = "0.";
41. for (int i = 0; i < c; i++)
42. temp += "0";
43. DecimalFormat gd = new DecimalFormat(temp);
44. System.out.println(gd.format(eps));
45. } else
46. System.out.println(eps);
47. }
48. }
49. }
50. }
4.大数递推
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=114
1. import java.io.*;
2. import java.math.BigInteger;
3. import java.util.*;
4.
5. public class Main
6. {
7. public static void main(String args[])
8. {
9. Scanner cin = new Scanner(System.in);
10. BigInteger a[] = new BigInteger[100];
11. while(cin.hasNext())
12. {
13. for(int i = 0; i <= 2; ++i)
14. a[i] = cin.nextBigInteger();
15. for(int i = 3; i <= 99; ++i)
16. a[i] = a[i - 1].add(a[i - 2]).add(a[i - 3]);
17. System.out.println(a[99]);
18. }
19. }
20. }
5、进制转换:PKU1311八进制浮点数化为十进制浮点数,高精度
1. import java.io.*;
2. import java.util.*;
3. import java.math.*;
4. public class Main {
5. public static void main(String[] args) {
6. Scanner cin = new Scanner(System.in);
7. BigDecimal temp, sum, ans, num; // java大数
8. String str;
9. int i, len;
10. while (cin.hasNext()) {
11. str = cin.next();
12. len = str.length();
13. temp = BigDecimal.valueOf(8.0);
14. sum = BigDecimal.ONE;
15. ans = BigDecimal.ZERO;
16. for (i = 2; i < len; i++) {
17. int val = str.charAt(i) - '0';
18. num = BigDecimal.valueOf(val);
19. sum = sum.multiply(temp); // 8的n次幂
20. ans = ans.add(num.divide(sum)); // 按权累加
21. }
22. System.out.printf("%s [8] = ", str);
23. System.out.println(ans + " [10]");
24. }
25. }
26. }
6、高精度幂
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=155
1. import java.io.*;
2. import java.math.BigDecimal;
3. import java.util.*;
4.
5. public class Main
6. {
7. public static void main(String args[])
8. {
9. Scanner cin = new Scanner(System.in);
10. while(cin.hasNext())
11. {
12. BigDecimal ans = cin.nextBigDecimal();
13. int n = cin.nextInt();
14. String res = ans.pow(n).stripTrailingZeros().toPlainString(); // 整数去掉小数点和后面的0
15. if(res.startsWith("0")) //去掉前导0
16. {
17. res = res.substring(1);
18. }
19. System.out.println(res);
20. }
21. }
22. }