Java大数处理
以前整理过有关Java的基本知识,也写了几个有关java的题目,不过发现不够完善,现在重新整合一下。
1.Java的输入与输出
java的输入是先定义一个scanner,然后用这个进行输入,并且每一种输入都有相应的输入函数,具体如下:
public class Main { public static void main(String[] args) { Scanner cin = new Scanner ( System.in); int a; double b; BigInteger c; String st; a = cin.nextInt(); b = cin.nextDouble(); c = cin.nextBigInteger(); d = cin.nextLine(); // 每种类型都有相应的输入函数. } }
Java的输出相较于输入来说就简单一些了。
System.out.println(a + " " + b); System.out.printf("%d %10.5f\n", a, b); /*规格化的输出: 函数:这里0指一位数字,#指除0以外的数字(如果是0,则不显示),四舍五入.*/ DecimalFormat fd = new DecimalFormat("#.00#"); DecimalFormat gd = new DecimalFormat("0.000"); System.out.println("x =" + fd.format(x)); System.out.println("x =" + gd.format(x));
2.大数部分
java支持大数的操作,其中也是由具体函数实现的。看下面的例子:
int a = 123, b = 456; BigInteger x, y, z, ans; x = BigInteger.valueOf(a);//转换 y = BigInteger.valueOf(b); ans = x.add(y); ans = x.divide(y); ans = x.mod(y); if (ans.compareTo(x) == 0)//比较 System.out.println("相等");
这里就写出了int型转换成大数型以及加减乘除比较的基本操作。其中函数原型如下:
BigInteger add(BigInteger other) BigInteger subtract(BigInteger other) BigInteger multiply(BigInteger other) BigInteger divide(BigInteger other) BigInteger mod(BigInteger other) int compareTo(BigInteger other) static BigInteger valueOf(long x)
这是大整数的操作,其中还有一个数据类型为:BigDecimal,表示小数,操作与以上相同。
3.格式化输出:
以前做题遇到过这样的情况,如何去掉末尾的0,有一个具体的函数,stripTrailingZeros()函数就是用于去除末尾多余的0的,但是此时程序的输出为科学记数法例如: 1E+2。解决的方法很简单,如果想要避免输出科学计数法的字符串,我们要用toPlainString()函数代替toString()。如:System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());此时程序的输出就为 100。具体实现:
Scanner in=new Scanner (System.in); BigDecimal a,b; while(in.hasNext()) { a=in.nextBigDecimal(); b=in.nextBigDecimal(); System.out.println(a.add(b).stripTrailingZeros().toPlainString()); }
4.具体实例:
HDU - 1042:计算阶乘:
import java.io.*; import java.math.BigInteger; import java.util.*; public class Main//注意在oj提交是要用Main { public static void main(String[] args) { Scanner in=new Scanner (System.in); int n; while(in.hasNext()) { n=in.nextInt(); BigInteger sum=BigInteger.valueOf(1); for(int i=1;i<=n;i++) sum=sum.multiply(BigInteger.valueOf(i)); System.out.println(sum); } } }
POJ1001 计算a^b 注意是小数
import java.io.*; import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; public class Main//注意在oj提交是要用Main { public static void main(String[] args) { Scanner in=new Scanner (System.in); int n; BigDecimal a,b; while(in.hasNext()) { b=BigDecimal.valueOf(1); a=in.nextBigDecimal(); n=in.nextInt(); for(int i=0;i<n;i++) { b=b.multiply(a); } String s = b.stripTrailingZeros().toPlainString(); if(s.startsWith("0")) s=s.substring(1); System.out.println(s); } } }
HDU - 1753 计算A+B 保留最简形式
import java.io.*; import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; public class Main//注意在oj提交是要用Main { public static void main(String[] args) { Scanner in=new Scanner (System.in); BigDecimal a,b; while(in.hasNext()) { a=in.nextBigDecimal(); b=in.nextBigDecimal(); System.out.println(a.add(b).stripTrailingZeros().toPlainString()); } } }
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); BigInteger []k = new BigInteger[1100]; k[0] = BigInteger.valueOf(1); for(int j=1;j<310;j++) { k[j]=k[j-1].multiply(BigInteger.valueOf(4*j-2)).divide(BigInteger.valueOf(j+1)); } while (true) { int times=input.nextInt(); BigInteger sum=BigInteger.valueOf(1); if(times!=0) { for(int i=1;i<=times;i++) sum=sum.multiply(BigInteger.valueOf(i)); System.out.println(sum.multiply(k[times])); } else { break; } } } }