java大数

本文通过四个实战题目展示了Java中处理大数的方法,包括大数阶乘、大数比较、大数四则运算和大数递推。示例代码详细解释了如何使用`BigInteger`类进行大数操作,如加法、减法、乘法、除法以及幂运算。
摘要由CSDN通过智能技术生成
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.   }  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值