首页 > 代码库 > ACM的java 傻瓜式教学

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);            }                    }                                                   }}


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

 

ACM的java 傻瓜式教学