java简单功能强大,高精度类可以帮队员轻松地实现对大数操作,而不用C/C++手写高精度。使用java做题,不容易犯一些低级的错误,如: if (a = b)。刚刚接触acm的时候,笔者还不会使用java,为此还特地花了一个月时间学习了一下java语言。现在回过头来发现,学会在比赛中熟练地使用java其实根本不需要花很长时间......所以在这里小结一下java在acm比赛中的使用。
1.开发环境
打开喜闻乐见的Eclipse->新建一个Java Project->新建一个class。
2.基本框架
import java.io.*; import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { System.out.println("Hello,ACM"); } }
3.读取数据
import java.io.*; import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(System.in); int n; n=cin.nextInt(); System.out.println(n); } }4.输出结果
例题:BNUOJ 1004 新生指导
import java.io.*; import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(new BufferedInputStream(System.in)); while (cin.hasNext()) { int n; n=cin.nextInt(); System.out.println(n); } } }
5.数学函数
import java.io.*; import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(new BufferedInputStream(System.in)); while (cin.hasNext()) { int n; n=cin.nextInt(); System.out.println(Math.sqrt(n)); } } }
6.高精度整数BigInteger类
例题:POJ 1503 Integer Inquiry
import java.io.*; import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { BigInteger b1,sum; Scanner cin=new Scanner(new BufferedInputStream(System.in)); sum=new BigInteger("0"); while (cin.hasNext()) { b1=cin.nextBigInteger(); if (b1.compareTo(new BigInteger("0")) == 0) { break; } sum=sum.add(b1); } System.out.println(sum); } }
例题:POJ 1001 Exponentiation
import java.math.*; import java.util.*; import java.io.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { BigDecimal R = in.nextBigDecimal(); int n = in.nextInt(); R = R.pow(n); String str = R.stripTrailingZeros().toPlainString(); if (str.startsWith("0.")) str = str.substring(1); System.out.println(str); } } }
注:
stripTrailingZeros()
8.进制转换
String st = Integer.toString(num, base);
例题:POJ 2305 Basic remains
import java.io.*; import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { int b; BigInteger p,m,ans; String str ; Scanner cin = new Scanner (new BufferedInputStream(System.in)); while(cin.hasNext()) { b=cin.nextInt(); if(b==0) break; p=cin.nextBigInteger(b); m=cin.nextBigInteger(b); ans=p.mod(m); str=ans.toString(b); System.out.println(str); } } }
在acm/icpc信息战看到的这篇文章中,提到了比赛中可以使用多线程,并且存在java优化时间常数的可能。故此处把这多线程运用也是列一下。
例题:BNUOJ 1021 信息战(七)——情报传递
import java.math.BigInteger; import java.util.*; public class Main extends Thread { public static Scanner cin=new Scanner(System.in); public int dir[][]={{1,0},{-1,0},{0,1},{0,-1}}; public int x,y,m,n,p,px[],py[]; public boolean ck[][]; public BigInteger dp[][]; public boolean flag; public void readData(Scanner cin) { int i,j; x=cin.nextInt(); y=cin.nextInt(); m=cin.nextInt(); n=cin.nextInt(); p=cin.nextInt(); ck=new boolean[201][201]; dp=new BigInteger[201][201]; px=new int[p]; py=new int[p]; for (i=0; i<p; i++) { px[i]=cin.nextInt(); py[i]=cin.nextInt(); } flag=false; } public boolean judge(int x,int y) { if (x < 0 || x > 200 || y < 0 || y > 200) return false; if (ck[x][y] == false) return false; return true; } public void run() { int i,j; int tx=1,ty=1; for (i=0; i<201; i++) { for (j=0; j<201; j++) { ck[i][j]=true; dp[i][j]=BigInteger.ZERO; } } for (i=0; i<p; i++) { ck[px[i]][py[i]]=false; for (j=0; j<4; j++) { tx=px[i]+dir[j][0]; ty=py[i]+dir[j][1]; if (judge(tx,ty) == true) ck[tx][ty]=false; } } dp[x][y]=BigInteger.ONE; if(x>m) tx=-1; else tx=1; if(y>n) ty=-1; else ty=1; for(i=x+tx;i!=m+tx;i+=tx) { if(judge(i,y)) dp[i][y]=dp[i][y].add(dp[i-tx][y]); } for(j=y+ty;j!=n+ty;j+=ty) { if(judge(x,j)) dp[x][j]=dp[x][j].add(dp[x][j-ty]); } for(i=x+tx;i!=m+tx;i+=tx) { for(j=y+ty;j!=n+ty;j+=ty) { if(judge(i,j) == false) continue; dp[i][j]=dp[i][j].add(dp[i-tx][j]).add(dp[i][j-ty]); } } flag=true; } public static void main(String[] args) { Main m[]; int prob,i; prob=cin.nextInt(); m=new Main[prob]; for (i=0; i<prob; i++) { m[i]=new Main(); m[i].readData(cin); m[i].start(); } for (i=0; i<prob; ) { if (m[i].flag == true) { System.out.println(m[i].dp[m[i].m][m[i].n]); i++; } } } }