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");
}
}
注:每道题通常都会注明java类名,如,BNUOJ的
Java class name:
Main ,类名必须要和其要求的一样。
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.输出结果
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类
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);
}
}
7.高精度小数BigDecimal类
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()
返回类型为BigDecimal的小于此数的但除去尾部的0的数值。
toPlainString()
返回BigDecimal类型的String类型字符串。
startsWith()
确定此实例的开头是否与指定的字符串匹配。
substring()
返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。
8.进制转换
String st = Integer.toString(num, base);
// 把num当做10进制的数转成base进制的st(base <= 35).
int num = Integer.parseInt(st, base);
// 把st当做base进制,转成10进制的int(parseInt有两个参数,第一个为要转的字符串,第二个为说明是什么进制).
BigInter m = new BigInteger(st, base);
// st是字符串,base是st的进制.
如果要将一个大数以2进制形式读入 可以使用cin.nextBigInteger(2); 当然也可以使用其他进制方式读入;
如果要将一个大数转换成其他进制形式的字符串 使用cin.toString(2);//将它转换成2进制表示的字符串
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);
}
}
}
9.多线程编程
在acm/icpc信息战看到的这篇文章中,提到了比赛中可以使用多线程,并且存在java优化时间常数的可能。故此处把这多线程运用也是列一下。
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++;
}
}
}
}