首页 > 代码库 > ACM中java的使用

ACM中java的使用

建议用IDE比如eclipse,因为有大量函数都会自动显示,相当方便

 

首先来看一题POJ1274的二分图匹配算法的java实现,给出总体的框架

import java.util.*;//基本框架

//主class必须与文件名相同 但在poj上交时class要改成Mainpublic class poj1274{ //需要设置static变量才可以在static void中使用 相当于全局变量 //数组具体数值需要通过new申请 static int be[], ne[], e[], all; static int pre[]; static boolean vis[]; static int n, m; public static void add(int x, int y) { e[all]=y; ne[all]=be[x]; be[x]=all++; } //java中0/1不再与false/true相同 public static boolean dfs(int x) { for(int i=be[x]; i!=-1; i=ne[i]) if(!vis[e[i]]) { vis[e[i]]=true; if(pre[e[i]]==0 || dfs(pre[e[i]])) { pre[e[i]]=x; return true; } } return false; } //main程序必须是static public static void main(String[] args) { //输入方法 //java的IO比C++慢很多 除此之外效率相当 Scanner cin = new Scanner(System.in); while(cin.hasNext())//判断是否还有输入 { //每次数组都需要申请 初始值一般都是0或false all = 0; //读入几乎都是nextXXX n = cin.nextInt(); m = cin.nextInt(); be = new int[n+m+5]; ne = new int[n*m*2+5]; e = new int[n*m*2+5]; vis = new boolean[n+m+5]; pre = new int[n+m+5]; //相当于memset,但只能用于一维数组的初始化 Arrays.fill(be, -1); for(int i=1; i<=n; i++) { int t=cin.nextInt(); for(int j=1; j<=t; j++) { int k=cin.nextInt(); add(i, k+n); } } int ans=0; for(int i=1; i<=n; i++) { Arrays.fill(vis, false); if(dfs(i)) ans++; } //输出 System.out.println(ans); } }}

其中java中主类中main方法必须用public static void,然而这样main中的调用的函数都应设置为static类,否则会显示警告信息。

不过也可以先建立对象,然后通过调用对象来用相应的函数

import java.util.*;public class test{    public void work()    {        //...    }    public static void main(String args[])    {        test e = new test();        e.work();    }}

 

从上述例子可以看出java的实现与C++差别不大,

接下来给出更系统的区别:

top 1 :输入输出

import java.util.*;import java.io.*;//标准输入输出流import java.math.*;//导入大整数BigIntegerimport java.text.*;//输出格式化public class test{    public static void main(String[] args)    {    //输入        Scanner cin = new Scanner(new BufferedInputStream(System.in));        Scanner cin2 = new Scanner(System.in);//上面输入方法会快一些        int a = cin.nextInt();        long b = cin.nextLong();        double c = cin.nextDouble();        BigInteger d = cin.nextBigInteger();        String s = cin.next();
     String s2 = cin.nextLine();
//输出 System.out.print(a); System.out.println(b); //相当于C++中printf 四舍五入保留三位小数 c的字宽为10 System.out.printf("%10.3f\n", c); System.out.println(d); //字符串连接用+ 很方便 System.out.println(s+‘!‘); //格式化输出 保留4位小数 若不足补0 DecimalFormat formatter = new DecimalFormat("#.0000"); System.out.println(formatter.format(c)); //多组数据读入 直到没有读入 while(cin.hasNext()) { } }}

 

top 2 : 大数应用

其实相应的加减乘除都有相应的函数,完全可以阅读出来

大分数:POJ1131

大意:八进制的小数 转 十进制

import java.util.*;import java.io.*;import java.math.*;public class poj1131{    public static void main(String args[])    {        int k;        BigDecimal ans, sum;        String str;        Scanner cin = new Scanner(new BufferedInputStream(System.in));        while(cin.hasNext())        {            str = cin.next();            sum = BigDecimal.ONE;            ans = BigDecimal.ZERO;            for(int i=2; i<str.length(); i++)            {                k = str.charAt(i)-‘0‘;                sum = sum.multiply(BigDecimal.valueOf(8));                ans = ans.add(BigDecimal.valueOf(k).divide(sum));            }            System.out.print(str+" [8] = ");            System.out.print(ans);            System.out.print(" [10]\n");        }    }}
View Code

 

大整数:POJ1306

大意:求C(n, m)

import java.util.*;import java.io.*;import java.math.*;public class poj1306{    public static void main(String args[])    {        Scanner cin = new Scanner(new BufferedInputStream(System.in));        while(cin.hasNext())        {            BigInteger ans = BigInteger.ONE;            int n = cin.nextInt();            int m = cin.nextInt();            if(n==0 && m==0)                break;            for(int i=1; i<=n; i++)                ans = ans.multiply(BigInteger.valueOf(i));            for(int i=1; i<=m; i++)                ans = ans.divide(BigInteger.valueOf(i));            for(int i=1; i<=n-m; i++)                ans = ans.divide(BigInteger.valueOf(i));            System.out.printf("%d things taken %d at a time is %s exactly.\n", n, m, ans.toString());        }    }}
View Code

 

top 3 : 其他操作

数组常用操作

import java.util.*;import java.io.*;import java.math.*;public class test{    public static void main(String args[])    {        int a[] = {10,2,2,5,7,8,9,11,1};        //复制数组        int b[] = Arrays.copyOf(a, a.length);        //排序        Arrays.sort(b);        //二分查找数组 要先排序        System.out.print(Arrays.binarySearch(b, 10));    }}

进制转换

import java.util.*;import java.math.*;public class test{    public static void main(String args[])    {        int a = 9999, base = 8;        //将数字a转换成base进制 并且转成string        String s = Integer.toString(a, base);        //将字符串s 其中s为base进制的数 转化为10进制的数        int b = Integer.parseInt(s, base);        //大整数初始值为字符串s 其中s为base进制的数        BigInteger c = new BigInteger(s, base);        //将大整数c转换成base进制 并且转成string        String s2 = c.toString(base);    }}

 

 

此外,java的实用功能有

java的正则表达式,可参见:http://blog.csdn.net/lenhan12345/article/details/1459667

java的常用集合(相当于C++中的STL,图片来源于网上),可参见:http://blog.csdn.net/mingchaoyan/article/details/6301858

 

至于更详细的部分,如果可能的话,我将在今后继续补充!

ACM中java的使用