【Java】-BigInteger大数类的使用【超强Java大数模板 总结】
Scanner cin = new Scanner(new BufferedInputStream(System.in));
这样定义Scanner类的对象读入数据可能会快一些!
参考这个博客继续补充内容:http://blog.csdn.net/lmyclever/article/details/6408980
1. 单元变量常用大数操作:
import java.util.Scanner; import java.math.*; public class Main{ public static void main(String args[]){ Scanner cin= new Scanner(System.in); //使用Sacnner类创建cin对象 BigInteger a, b;//创建大数对象 while(cin.hasNext()){ a=cin.nextBigInteger(); b=cin.nextBigInteger(); System.out.println("a+b="+a.add(b)); System.out.println("a-b="+a.subtract(b)); System.out.println("a*b="+a.multiply(b)); System.out.println("a/b="+a.divide(b)); System.out.println("a%b="+a.remainder(b)); if(a.compareTo(b)==0) //比较两数的大小 System.out.println("a==b"); else if(a.compareTo(b)>0) System.out.println("a>b"); else System.out.println("a<b"); System.out.println(a.abs());//取绝对值 int e=10; System.out.println(a.pow(e));//求a^e System.out.println(a.toString()); //将大数a转字符串输出 int p=8; System.out.println(a.toString(p)); //将大数a转换成p进制后 按字符串输出 } } }
2.java大数 实现递推公式:f[i]=f[i-1]+f[i-2]*2
import java.util.*; import java.math.*; //导入类 public class Main{ static BigInteger[] ans; //定义全局变量 public static void main(String[] args){ Scanner reader=new Scanner(System.in); //定义Scanner类对象 ans = new BigInteger[251]; //定义ans大数数组的大小 ans[0]=BigInteger.valueOf(1);//大数赋初值 ans[1]=BigInteger.valueOf(1); ans[2]=BigInteger.valueOf(3); for(int i=3; i<=250; i++) { ans[i] = ans[i-1].add(ans[i-2].multiply(BigInteger.valueOf(2))); } //大数加法的使用 int n; while(reader.hasNextInt()){ n=reader.nextInt(); System.out.println(ans[n]); //普通输出 } } }
3. HDOJ 1047 Integer Inquiry
T组大数,每组数据输入直到0终止,计算刚才输入的数之和。数字会很大。
java code:(注意:BigInteger.ZERO 和 普通的0不同,这在java代码里面要体现出来 )
import java.util.Scanner; import java.math.*; public class Main{ public static void main(String args[]){ Scanner cin = new Scanner(System.in); int tg; tg=cin.nextInt(); while(tg>0){ BigInteger cur, sum; sum=BigInteger.ZERO; // while(cin.hasNext()){ cur=cin.nextBigInteger(); if(cur.equals(BigInteger.ZERO)) break; //判断是不是0 sum=sum.add(cur); //不断累加 } System.out.println(sum); if(tg!=1) System.out.println(); tg--; } } }
4.hdu 1753 大明A+B (两个超长的浮点类型数求和)使用java BigDecimal类 并且将结果转为字符串输出
code:
import java.util.Scanner; import java.math.BigInteger; import java.math.BigDecimal; public class Main{ public static void main(String args[]){ Scanner cin = new Scanner(System.in); BigDecimal a, b, ans; while(cin.hasNext()){ a=cin.nextBigDecimal(); b=cin.nextBigDecimal(); ans=a.add(b); String s=ans.stripTrailingZeros().toPlainString(); System.out.println(s); } } }
5. HDU 1715 (java计算1000以内的斐波那契数列)
code:
package java_1; import java.util.Scanner; import java.math.BigInteger; import java.math.BigDecimal; public class Main{ public static void main(String args[]){ Scanner cin = new Scanner(System.in); BigInteger f[]; f=new BigInteger[1100]; f[1]=f[2]=BigInteger.valueOf(1); for(int i=3; i<=1000; i++){ f[i]=f[i-1].add(f[i-2]); } int tg; tg=cin.nextInt(); int n; for(int i=0; i<tg; i++){ n=cin.nextInt(); System.out.println(f[n]); } } }
6. HDU 1063 Exponentiation (计算一个a的b次方, a是一个长浮点数, b是整数)
输出时,如果结果是0.XXXXXX 这时候前面的0要忽略掉不输出。
代码:
import java.util.Scanner; import java.math.BigDecimal; import java.math.BigIntege; public class Main{ public static void main(String args[]){ Scanner cin = new Scanner(System.in); BigDecimal a, ans; int n, i; while(cin.hasNext()){ a=cin.nextBigDecimal(); n=cin.nextInt(); ans=BigDecimal.valueOf(1); for(i=1; i<=n; i++) ans=ans.multiply(a); String s=ans.stripTrailingZeros().toPlainString(); if(s.startsWith("0."))//如果开头是0.XXX 从下标1开始输出 System.out.println(s.substring(1)); else System.out.println(s); } } }
7. java大数实现计算阶乘,本以为很简单,写起来之后却发现了不少自己的能力问题。
(1)java BigInteger只能和大数的类型相运算,不能和int等进行运算。
(2)强制类型装换:int先转换成String类型,在转换成BigInteger类型。
code:
import java.util.Scanner; import java.math.BigDecimal; import java.math.BigInteger; public class Main{ public static void main(String args[]){ Scanner cin = new Scanner(System.in); BigInteger ans; ans=BigInteger.valueOf(1); int n; n=cin.nextInt(); for(int i=2; i<=n; i++){ String temp=Integer.toString(i); BigInteger t=new BigInteger(temp); ans = ans.multiply(t); } System.out.println(ans); } }
8. HDU 4762 Cut the Cake
输出:n/( m^(n-1) ) , m^(n-1)是个大数,并且最后这个分式要化简。
import java.util.Scanner; import java.math.BigInteger; public class Main{ public static void main(String args[]){ Scanner cin=new Scanner(System.in); int m, n; int tg; tg=cin.nextInt(); for(int cnt=0; cnt<tg; cnt++){ m=cin.nextInt(); n=cin.nextInt(); String temp=Integer.toString(m); BigInteger cur=new BigInteger(temp); BigInteger ans=cur.pow(n-1);// temp=Integer.toString(n); BigInteger nn=new BigInteger(temp); if(nn.mod(ans).equals(BigInteger.valueOf(0))){ System.out.println(nn.divide(ans)); } else{ System.out.print(nn.divide(ans.gcd(nn)) + "/"); System.out.println(ans.divide(ans.gcd(nn))); } } } }