首页 > 代码库 > 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"); } }}
大整数: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()); } }}
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的使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。