ACM中java的使用

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

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

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

//主class必须与文件名相同 但在poj上交时class要改成Main
public 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.*;//导入大整数BigInteger
import 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

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

时间: 2024-11-09 09:23:31

ACM中java的使用的相关文章

ACM中java的使用 (转)

ACM中java的使用 这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 1. 输入: 格式为:Scanner cin = new Scanner (new BufferedInputStream(System.in)); 例程: import java.io.*; import java.math.*; import java.util.*; import java.text.*; public class

【转】ACM中java的使用

原文博客:http://www.cnblogs.com/XBWer/archive/2012/06/24/2560532.html ACM中java的使用 这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 1. 输入: 格式为:Scanner cin = new Scanner (new BufferedInputStream(System.in)); 例程: import java.io.*; import

ACM中Java使用注意事项

1. String 类用来存储字符串,可以用charAt方法来取出其中某一字节,计数从0开始, 而不是像C/C++那样使用 []访问是每个字符. 2. 在主类中 main 方法必须是 public static void 的,在 main 中调用非static类时会有警告信息, 可以先建立对象,然后通过对象调用方法. 3.  下面在java.util包里Arrays类的几个方法可替代C/C++里的memset.qsort/sort 和 bsearch: Arrays.fill() Arrays.

ACM中java中BigInteger和Decimal用到的主要函数

java中大数以及高精度常用函数 使用java大数类解决问题时我们需要注意两个方面:1.不能有包名,也就是说我们要把主类放到默认的包里,如果你的代码里出现形如package cn.gov.test;这样的代码你很有可能会收获到RE 2.提交的类的类名必须为Main,如果是其他的名字你有可能收获到CE也有可能收获到WA(例如UVA) Scanner cin=new Scanner(System.in);// 读入 一.BigInteger import java.math.BigInteger;

ACM中Java高效输入输出封装

来自互联网 : 既高效又好用才是王道! import java.io.IOException; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; import jav

[原创]浅谈JAVA在ACM中的应用

由于java里面有一些东西比c/c++方便(尤其是大数据高精度问题,备受广大ACMer欢迎),所以就可以灵活运用这三种来实现编程,下面是我自己在各种大牛那里总结了一些,同时加上自己平时遇到的一些java上面的东西,像结构体排序什么的都有添加进去,博客一直会在更新,对初学者还是有一些帮助的,大牛们就可以忽略了,如果博客有什么问题,欢迎指出! java中的输出a+b import java.io.*; import java.util.*; public class Main { public st

Java中的BigInteger在ACM中的应用

Java中的BigInteger在ACM中的应用 在ACM中的做题时,经常会遇见一些大数的问题,这是当我们用C或是C++时就会觉得比较麻烦,就想有没有现有的现有的可以直接调用的BigInter,那样就方便很多啦.在java中就有的,所以在这儿我就做一个简要的介绍吧 -:在java中的基本头文件(java中叫包) import java.io.* importjava.util.*       我们所用的输入scanner在这个包中 importjava.math.*          我们下面要

java在acm中常用基础技巧方法

java在acm中常用基础技巧方法 如果学到了新的技巧,本博客会更新~ input @Frosero import java.util.*; public class Main { static String a; static int c; static Scanner cin = new Scanner(System.in); public static void main(String[] args) { while(cin.hasNext()){ // while(scanf("%d&q

ZOJ ACM 2022(JAVA)

题目描述请参考:ZOJ ACM 2022 1)难点分析 是大数阶乘的延伸.如果要通过计算大数阶乘的方式来计算末尾0的位数,时间效率远远无法满足2秒的要求. 2)解决方法 通过结果的规律来进行运算.设定计算N的阶乘的结果末尾为0的位数.其中N=N*(N-1)*....*i*....*1,尾数为0的尾数为zeroNumber. 首先,只有当i为5的倍数时,i*2必然个位数为0: 其次,当i为5的k次方时,i*(2的k次方) = (5*2)的k次方,所以必然末尾有k个0.由于是阶乘运算,5的k次方,必