ACM的java 傻瓜式教学

关于eclipse的配置 我感觉我讲不清【逃

 

 

开始

从配好之后讲起

文件名命名为Main.java【接下来几行解释为什么要起这个名字

注意第七行那里(为了方便复制我没有加行号)的类的名字必须与文件名相同

但是你会看到各大oj的FAQ上有一些要求

比如hdu上有这个

然后貌似我今年去鞍山打区域赛的时候也有这个要求 所以就不要倔吧 就起这个名

 

“框架”

然后大概所谓“框架”就是这样

import java.util.*;
import java.io.*;
import java.math.*;
import java.text.*;


public class Main 
{
public static void main(String[] args) { Scanner cin = new Scanner(new BufferedInputStream(System .in)); /*program*/ } }

eclipse非常方便就是如果你少import了什么库它会给你提示或者自动给你加

所以再也没有之前刚开始学c学c++时 调用函数却闹不清头文件的烦恼

 

之后默认的话是F11就编译运行了~

 

函数

列了几个我个人觉得比较实用的函数:

BigDecimal add(BigDecimal augend) :加法

BigDecimal subtract(BigDecimal subtrahend) :减法

BigDecimal divide(BigDecimal divisor) :除法  

BigDecimal pow(int n) :乘幂

BigDecimal multiply(BigDecimal multiplicand) :乘法

int compareTo(BigDecimal number):比较两个数 比如a.compareTo(b) a<b返回-1【<0】 a==b返回0 a>b返回1【>0】 很好记

public String substring(int beginIndex):相当于删掉字符串的前几位

public String substring(int beginIndex,int length):相当于取字符串中间一段 (注意第二个参数是长度而不是截止位置的下标)

BigDecimal stripTrailingZeros(BigDecimal number):对于一个高精度小数 从表示形式上移除所有尾部的无用零

String toPlainString(BigDecimal number):高精度小数转字符串(进而可以方便地使用字符串处理函数)

 

实例

讲多无谓 上几个例子自己写写就懂了

hdu1042 大数阶乘 

import java.util.*;
import java.io.*;
import java.math.BigInteger;
import java.text.*;


public class Main {
    public static void main(String[] args)
    {    
        Scanner cin = new Scanner(new BufferedInputStream(System .in));
        
        int n;
        while(cin.hasNextInt())    //类似于以前判EOF的方式 
        {
            int a = cin.nextInt();  //整数读入方法
            
            if(a == 0)         //特判0! = 1
            {
                System.out.println("1");
                continue;
            }
            
            BigInteger ans = BigInteger.valueOf(a);  //valueOf()可以把数转成各个类对应的类型
            
            for(int i = 2; i < a; i++)
            {
                ans = ans.multiply(BigInteger.valueOf(i));              
            }
            
            System.out.println(ans);
        }
        

    }
}

个人觉得就像c++中类的成员函数的各种调用

 

 

hdu 2054

import java.util.*;
import java.io.*;
import java.math.*;
import java.text.*;


public class Main {
    public static void main(String[] args)
    {    
        Scanner cin = new Scanner(new BufferedInputStream(System .in));
        
        BigDecimal a, b;
        while(cin.hasNext())
        {
            a = cin.nextBigDecimal();
            b = cin.nextBigDecimal();
            
            if(a.compareTo(b) == 0)
                System.out.println("YES");
            else
                System.out.println("NO");
            
        }
        

    }
}

 

hdu 1047 

import java.util.*;
import java.io.*;
import java.math.*;
import java.text.*;


public class Main {
    public static void main(String[] args)
    {    
        Scanner cin = new Scanner(new BufferedInputStream(System .in));
        
        int T;
        T = cin.nextInt();
        BigInteger a, b;
        BigInteger zero = new BigInteger("0");
        for(int i = 0; i < T; i++)  //本来我习惯写while(T--)的 不过这里面好像不行
        {
            a = zero;
            while(true)
            {
                b = cin.nextBigInteger();
                if(b.compareTo(zero) == 0)
                    break;
                a = a.add(b);
            }
            System.out.println(a);
            if(i < T-1)
                System.out.printf("%n");//这里是特地这么写的 ‘%n‘是跨平台的换行符 这样可以避免那个关于\r和\n的纠结问题
                       //也可以写成System.out.println("");
            
            
        }
        

    }
}

 

hdu 1063

import java.util.*;
import java.io.*;
import java.math.*;
import java.text.*;


public class Main {
    public static void main(String[] args)
    {    
        Scanner cin = new Scanner(new BufferedInputStream(System .in));
        
        
        
        while(cin.hasNextBigDecimal())
        {
            BigDecimal ans = new BigDecimal("1");
            BigDecimal a;
            int n;
            BigDecimal one = new BigDecimal("1");
            String anss;
            
            a = cin.nextBigDecimal();
            n = cin.nextInt();
            
            for(int i = 0; i < n; i++)
            {
                ans = ans.multiply(a);
            }
            
            ans = ans.stripTrailingZeros();
            anss = ans.toPlainString();
            
            if(ans.compareTo(one) < 0)
            {
                anss = anss.substring(1);
                System.out.println(anss);
            }                
            else
            {
                System.out.println(anss);
            }
        }

    }
}
关于stripTrailingZeros() 
举个例子 不加这句话的话 如果运算1.1 + 2.9 结果会输出4.0
加这个函数之后它就变成4了
这就是这个函数的作用

关于小数的最简形式
0.1 需要改成 .1
虽然觉得怪怪的 不过在计算器上输入“.1”它确实会识别出来
下面还有一道类似的题目


hdu 1316
import java.util.*;
import java.io.*;
import java.math.*;
import java.text.*;


public class Main {
    public static void main(String[] args)
    {    
        Scanner cin = new Scanner(new BufferedInputStream(System .in));
        
        BigInteger fibo[] = new BigInteger[1010];
        fibo[0] = new BigInteger("1");
        fibo[1] = new BigInteger("2");
        for(int i = 2; i < 1000; i++)
            fibo[i] = fibo[i-1].add(fibo[i-2]);
        
        BigInteger a, b;
        BigInteger zero = new BigInteger("0");
        while(true)
        {
            a = cin.nextBigInteger();
            b = cin.nextBigInteger();
            
            if(b.compareTo(zero) == 0)
                break;
            
            int ans = 0;
            boolean flag = false;  //这里面是boolean
            for(int i = 0; i < 1000; i++)
            {
                if(!flag && fibo[i].compareTo(a) >= 0)
                    flag = true;
                
                if(flag && fibo[i].compareTo(b) > 0)
                    break;
                
                if(flag)
                    ans++;                          
            }
            
            System.out.println(ans);
            
        }
        
    }
}

这个程序我也是模仿别人的写法的

然后我就特别好奇数组那里为毛两次new

然后抱“老头”(一个道骨仙风的世外高人)大腿之后才弄明白

对于第一个new:BigInteger fibo[] = new BigInteger[1010];

可以理解为C++中的 int *fibo[] 即,java中那种写法它实际上只是为1010个指针分配的空间 而不像c++中 int fibo[1010] 就已经为数据开辟出一片空间了

所以第二个new:fibo[0] = new BigInteger("1");

之所以可以这么写就比较自然了吧 

当然也可以不这么写 

fibo[0] = BigInteger.valueOf(1); 这种写法也是阔仪滴

 

hdu 1715

import java.util.*;
import java.io.*;
import java.math.*;
import java.text.*;


public class Main {
    public static void main(String[] args)
    {    
        Scanner cin = new Scanner(new BufferedInputStream(System .in));
        
        BigInteger fibo[] = new BigInteger[1010];
        fibo[1] = new BigInteger("1");
        fibo[2] = new BigInteger("1");
        for(int i = 3; i < 1010; i++)
            fibo[i] = fibo[i-1].add(fibo[i-2]);
        
        int T;
        T = cin.nextInt();
        for(int i = 0; i < T; i++)
        {
            int n;
            n = cin.nextInt();
            System.out.println(fibo[n]);            
        }        
        
    }
}


hdu 1753
import java.util.*;
import java.io.*;
import java.math.*;
import java.text.*;


public class Main {
    public static void main(String[] args)
    {    
        Scanner cin = new Scanner(new BufferedInputStream(System .in));
        
        BigDecimal a, b;
        
        while(cin.hasNextBigDecimal())
        {
            a = cin.nextBigDecimal();
            b = cin.nextBigDecimal();
            
            BigDecimal ans = a.add(b);
            ans = ans.stripTrailingZeros();
            
            String anss = ans.toPlainString();
            
            BigDecimal one = new BigDecimal("1");
            if(ans.compareTo(one) < 0)
            {
                anss = anss.substring(1);
                System.out.println(anss);
            }
            else
            {
                System.out.println(anss);
            }
            
        }
            
       
            
        
        
    }
}


刷完这些题之后对这里面最基本的操作就应该没什么问题辣~

 

posted @ 2014-12-04 20:36  地鼠地鼠  阅读(388)  评论(1编辑  收藏  举报