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); } } } }
刷完这些题之后对这里面最基本的操作就应该没什么问题辣~