ACM中Java的应用

先说一下Java对于ACM的一些优点吧:
(1) 对于熟悉C/C++的程序员来说Java 并不难学,两周时间基本可以搞定一般的编程,再用些时间了解一下Java库就行了。Java的语法和C++非常类似,可以说是C++的升级版,只是更加强调面向对象思想而已。(个人见解。。。)

(2) 在一般比赛中,Java程序会有额外的时间和空间,但真正进行大规模运算时Java并不比C/C++慢,输入输出效率比较低而已
(3) Java 代码简单且功能强大,有些像高精度之类的算法用Java实现起来更为简洁方便(ACM真正比赛时是讲究做题速度的,任何题只要能过就行,而不必过于要求程序的速度有多高,不超时就好)。

*小技巧:某些题目用Java超时的话可以用Java打表然后用C/C++提交

(4) 用Java不易犯细微的错误,比如C/C++中的指针, “if (n = m) … ” 等。

(5) 目前Eclipse已成基本配置,写Java程序反而比C/C++更方便调试。在具体竞赛时也算多一种选择。

关于ACM中应用的一些问题:
(1) JDK 1.5.0 及其以上版本提供的Scanner类为输入提供了良好的基础,很好地优化Java的输入问题。
代码如下:

import java.io.* import java.util.*
public class Main {
    public static void main(String args[])
    {
         Scanner cin = new Scanner(new BufferedInputStream(System.in));     

    }
} 

也可以直接 Scanner cin = new Scanner(System.in); 加Buffer可能会快一些。

(2) 读一个整数: int n = cin.nextInt(); 相当于 scanf(“%d”, &n); 或 cin >> n;
读一个字符串:String s = cin.next(); 相当于 scanf(“%s”, s); 或 cin >> s;
读一个浮点数:double t = cin.nextDouble(); 相当于 scanf(“%lf”, &t); 或 cin >> t;
读一整行: String s = cin.nextLine(); 相当于 gets(s); 或 cin.getline(…);
判断是否有下一个输入可以用 cin.hasNext() 或 cin.hasNextInt() 或 cin.hasNextDouble()

(3) 输出一般可以直接用 System.out.print() 和 System.out.println(),前者不输出换行,而后者输出。

System.out.println(n);   // n 为 int 型 同一行输出多个整数可以用 

System.out.println(new Integer(n).toString() + " " + new Integer(m).toString()); 

//也可重新定义: 

static PrintWriter cout = new PrintWriter(new BufferedOutputStream(System.out));     

cout.println(n);

(4)对于输出浮点数保留几位小数的问题,可以使用DecimalFormat类,

import java.text.*;
    DecimalFormat f = new DecimalFormat("#.00#");
    DecimalFormat g = new DecimalFormat("0.000");
    double a = 123.45678, b = 0.12;
    System.out.println(f.format(a));
    System.out.println(f.format(b));
    System.out.println(g.format(b)); 

大数:

BigInteger 和 BigDecimal 是在java.math包中已有的类,前者表示整数,后者表示浮点数

import java.math.*  // 需要引入 java.math 包
BigInteger a = BigInteger.valueOf(100);
BigInteger b = BigInteger.valueOf(50);
BigInteger c = a.add(b)   // c = a + b; 

//主要有以下方法可以使用:
BigInteger add(BigInteger other)
BigInteger subtract(BigInteger other)
BigInteger multiply(BigInteger other)
BigInteger divide(BigInteger other)
BigInteger mod(BigInteger other)
int compareTo(BigInteger other)
static BigInteger valueOf(long x) 

//输出数字时直接使用 System.out.println(a) 即可

字符串:

String 类用来存储字符串,可以用charAt方法来取出其中某一字节,计数从0开始:

String a = "Hello";    // a.charAt(1) = 'e'

用substring方法可得到子串,如上例

System.out.println(a.substring(0, 4))     // output "Hell"

注意第2个参数位置上的字符不包括进来。这样做使得 s.substring(a, b) 总是有 b-a个字符。

字符串连接可以直接用 + 号,如

String a = "Hello";
String b = "world";
System.out.println(a + ", " + b + "!");    // output "Hello, world!"

如想直接将字符串中的某字节改变,可以使用另外的StringBuffer类。

调用递归(或其他动态方法)
在主类中 main 方法必须是 public static void 的,在 main 中调用非static类时会有警告信息,
可以先建立对象,然后通过对象调用方法:

public class Main { 

    void dfs(int a)
    {
              if () return; 

             dfs(a+1);
    }
    public static void main(String args[])
    { 

         Main e = new Main();
              e.dfs(0); 

    }
} 

其他注意的事项:

(1) Java 是面向对象的语言,思考方法需要变换一下,里面的函数统称为方法,不要搞错。

(2) Java 里的数组有些变动,多维数组的内部其实都是指针,所以Java不支持fill多维数组。
数组定义后必须初始化,如 int[] a = new int[100];

(3) 布尔类型为 boolean,只有true和false二值,在 if (…) / while (…) 等语句的条件中必须为boolean类型。
在C/C++中的 if (n % 2) … 在Java中无法编译通过。

(4) 下面在java.util包里Arrays类的几个方法可替代C/C++里的memset、qsort/sort 和 bsearch:

Arrays.fill()
Arrays.sort()
Arrays.binarySearch()   

虽然Java功能很强大,但不能完全依赖他,毕竟C和C++还是ACM/ICPC的主流语言,适当地使用才能有效提高比赛中的成绩。。。

附:
例题:HDOJ 1002

import java.math.BigDecimal;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int t=1;
        while(n-->0){
            if(t==1){

            }else{
                System.out.println();
            }

            BigDecimal a = sc.nextBigDecimal();
            BigDecimal b = sc.nextBigDecimal();
            BigDecimal c = a.add(b);
            System.out.println("Case "+t+":");
            System.out.println(a+" + "+b+" = "+c);
            t++;
        }
    }
}
时间: 2024-10-12 00:17:18

ACM中Java的应用的相关文章

stylesheet-bootstrap中的导航中java为何在360浏览器java下拉菜单点了没反应

问题描述 bootstrap中的导航中java为何在360浏览器java下拉菜单点了没反应 <!DOCTYPE html> Bootstrap 实例 - 带有下拉菜单的标签 带有下拉菜单的标签 Home SVN iOS VB.Net Java Swing jMeter EJB 分离的链接 PHP 以下是显示的图片 解决方案 电脑感染了360等非法流氓软件 解决方案二: 有可能是浏览器禁用了js--换个浏览器--比如谷歌火狐--

工程中Java Code Review发现的问题汇总

工程中Java Code Review发现的问题汇总 概述 最近对团队内近期开发的一些Java web工程进行了Code Review,这些Code主要是需要在多个工程中复用的基础组件,Java代码为主.审核中发现了一些编码问题(暂时不考虑设计模式.架构层面的),这里进行一下汇总总结. 问题列表 注释 普通的程序员最痛恨接手或使用没有文档的代码,而程序员一般又不喜欢些文档,代码注释是文档的一种,在Code Review中发现工具扫描时注释率很高,但是真正进去去看,注释率极低. 接口一定要有详细的

c++ acm 括号配对-c++编写的ACM中的括号配对问题

问题描述 c++编写的ACM中的括号配对问题 最近在做ACM上的题目,在vs上写了一个括号配对的程序能运行出来,但是放到ACM上就是各种错误,最多的是runtimeerror,下面附上程序,希望高手能指点一下.. #include #include #include #include using namespace std; int main() { int N; //测试数据组 cin>>N; if(N100) { cout<<"please input number

java-myeclipse中Java导出项目报错

问题描述 myeclipse中Java导出项目报错 解决方案 出现这个问题是因为编译的时候编码跟文件存储的编码方式不一样造成的,你可以参考下这篇blog,希望对你有帮助. 解决方案二: 那你看下这个问题和答案,也许可能有你需要的 解决方案三: 刚刚那个忘插入链接了

图片-求教大神在myeclipse中java项目部署不到tomcat是什么原因

问题描述 求教大神在myeclipse中java项目部署不到tomcat是什么原因 解决方案 MyEclipse中的java项目,部署到tomcat失败MyEclipse中无法部署tomcat的原因MyEclipse中无法部署tomcat的原因 解决方案二: 你这个tomcat安装配置的有问题啊, 在本地先单独起一下服务器看行不 之后如果行,就是myeclipse里的配置问题 如果不行,你就重装吧 解决方案三: 你建的项目是web项目吗 解决方案四: 不是我建的是java项目,web项目是可以部

方法-eclipse 中JAVA如何实现清屏

问题描述 eclipse 中JAVA如何实现清屏 编辑了一段代码,让用户输入账号密码,如果账号密码正确就进入选择界面,在进入选择界面之前,我想把屏幕上面输入的账号密码吗全部清除!该如何实现!不用循环换行java里面的方法行吗? 解决方案 代码清空控制台?手动清空可以,console里有个clear console的小图标 点一下就行了代码清空--连续输出50行,控制台应该干净了 for(int i=0;i<=50;i++){ System.out.println();} 解决方案二: 不理解你的

悠然乱弹:开源中国GIT中Java分类下TOP10项目的活动情况分析

TOP 10 ThinkGem / JeeSite 项目GIT情况统计 从上面看到,总共参与的贡献者有15个人,10个以上提交者有3个,最近1个月一个提交也没有.默认分支文件总数有5490. 从这里可以看出,项目规模比较大.总共的提交数是243个,说明整体活动情况还不错,但是现在的活动性在下降. Issues总数:18个,打开数:10个,已关闭8个. 项目最近提交情况 最近的提交是1个月前了. TOP 9 oschina / search-framework 项目GIT情况统计 从上面看到,总共

应用-广义表和链表在acm中的重要性

问题描述 广义表和链表在acm中的重要性 数据结构课中学习了广义表,好奇其在实际应用编程中的应用 特别是在acm 解决方案 广义表侧重于阐述一种递归的数据结构的概念,这种概念对于诸如分治法.分区.矩阵运算等等都很有用,而链表则是构造各种更复杂数据结构,比如队列.堆栈.向量.树.图.环等等的基础.

c++-大一刚转专业的,请问下,代码在acm中时间超限为什么

问题描述 大一刚转专业的,请问下,代码在acm中时间超限为什么 #include using namespace std; int main() { int n, a[50], i,j,num,max,count; while (cin >> n) { if (n == 0) break; max = 0; num = 1; for (i = 0; i < n; i++) { cin >> a[i]; if (a[i] == 0) break; if (a[i]>max