本文并不是在介绍Java,并不是零基础教学
本文是针对Acmer的Java总结而已。
准备好了吗,让我们开始吧
-----BIGBALLON
2014-10-02 19:40:47
目录
0. 初心之 Java必备基础篇
强烈推荐以下两篇文章
1. 脑残的孩子只有慢慢学。。
2. CodeBlog
3. 若需要了解其他更多相关用法,请自行查阅java api
其实你可以先看一个例子,然后我们一一讲解例子中用到的东西
import java.io.*; import java.util.*; import java.math.BigInteger; public class Main{ public static void main(String[] args) throws IOException{ Scanner in = new Scanner(new BufferedInputStream(System.in)); //Scanner流,用来进行读入 //调试专用 //相当于freopen() /* FileInputStream fin = new FileInputStream("in.txt") ; PrintStream fout = new PrintStream("out.txt"); System.setIn(fin); System.setOut(fout); */ System.out.println("this is d demo!"); //相当于printf("this is d demo!\n"); 有换行 System.out.print("good job"); //相当于printf("good job"); 无换行 System.out.println(); System.out.printf("I love printf\n"); //JDK5.0之后,可以使用printf, C语言使用者的福音啊 int a = in.nextInt(); //相当于scanf("%d",&a); double b = in.nextDouble(); //相当于scanf("%lf",&b); String s = in.next(); //相当于scanf("%s",s); String ss = in.nextLine(); //相当于gets(ss); BigInteger c = in.nextBigInteger(); //直接接收一个大数,Java大数类神器 int t; while(in.hasNext()){ //用来判断EOF t = in.nextInt(); System.out.println("t = " + t); //相当于printf("t = %d\n",t); String str = String.valueOf(t); System.out.println("str = " + str); } BigInteger BIG = BigInteger.ONE; BigInteger BIGG = BigInteger.ZERO; BigInteger GG = BigInteger.valueOf(111); BigInteger GGG = GG; GG = GG.add(GGG); GG = GG.subtract(GGG); GG = GG.multiply(GGG); GG = GG.divide(GGG); GG = GG.gcd(GG); int num = 100; String s1 = new String("whiteblock63"); String s2 = String.valueOf(s1); String s3 = String.valueOf(num); String ss1, ss2, ss3, ss4; int aa = 100; ss1 = Integer.toString(aa,2); //把int型数据转换为2进制数并转换成string型 int bb = Integer.parseInt(ss1,10); //把string字符转换为10进制的int型 Double xx = 100.111; ss4 = Double.toString(xx); //Double 转换为字符串,double没有进制这个说法 BigInteger cc = BigInteger.valueOf(101); //初始化一个大数c = 101 ss2 = cc.toString(2); //将大数转化为二进制的字符串 ss3 = cc.toString(10); //将大数转化为十进制的字符串 BigInteger aaa = new BigInteger(ss2,2); } }
a. import 篇
在Java中用的是 import 引入class类.
import java.util.*; //输入输出需要用到 import java.math.*; //大数类在math里面 import java.io.*; //BufferedInpitStream需要用到
b. 输入输出篇
Scanner是一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。它使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
最常用的输入
Scanner in = new Scanner( new
BufferedInputStream(System.in) );
最常用的输出 System.out.pritnln(); System.out.print(); JDK 5.0 之后支持System.out.printf()
c语言使用者的福音,不用解释了。爽到爆
读入一个int int a = in.nextInt(); 读入一个double double b = in.nextDouble(); 读一行 String c = in.nextLine(); 读一个字符串 String d = in.next(); 读一个大数 BigInteger c = in.nextBigInteger(); 判断文件结尾 in.hasNext();
c. 文件操作 (调试专用)
在C语言中可以使用freopen()来进行文件重定向,Java中我们使用文件输入流FileInputStream
FileInputStream fin = new FileInputStream("in.txt") ; PrintStream fout = new PrintStream("out.txt"); System.setIn(fin); System.setOut(fout);
d. String类的相关方法的调用
int num = 100; String s = new String("whiteblock63"); String ss = String.valueOf(s); String sss = String.valueOf(num);
e. 进制转换 -- JAVA神器
适用于string转int int转string string转大数,大数转string
String s1, s2, s3, s4; int a = 100; s1 = Integer.toString(a,2) //把int型数据转换为2进制数并转换成string型 int b = Integer.parseInt(s,10); //把string字符转换为10进制的int型 Double xx = 100.111; s4 = Double.toString(xx); //Double 转换为字符串,double没有进制这个说法 BigInteger c = BigInteger.valueOf(101); //初始化一个大数c = 101 s2 = c.toString(2); //将大数转化为二进制的字符串 s3 = c.toString(10); //将大数转化为十进制的字符串 BigInteger a = new BigInteger(s2,2); //BigInteger(String val,int radix); //将指定基数的BigInteger的字符串表示形式转换为BigInteger
import java.io.*; import java.math.BigInteger; import java.util.*; public class Main { static PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(System.out))); public static void main(String[] args) throws IOException { Scan scan = new Scan(); int t = scan.nextInt(); for (int c = 1; c <= t; c++) { String s = scan.next(); BigInteger a = new BigInteger(s,2); s = scan.next(); BigInteger b = new BigInteger(s,2); out.println("Case #" + c + ": " + a.gcd(b).toString(2)); } out.flush(); } private static double max(double d, double e) { if (d - e > 0) return d; return e; } } class Scan { BufferedReader buffer; StringTokenizer tok; Scan() { buffer = new BufferedReader(new InputStreamReader(System.in)); } boolean hasNext() { while (tok == null || !tok.hasMoreElements()) { try { tok = new StringTokenizer(buffer.readLine()); } catch (Exception e) { return false; } } return true; } String next() { if (hasNext()) return tok.nextToken(); return null; } String nextLine() { String s = null; try { s = buffer.readLine(); } catch (Exception e) { return null; } return s; } char nextChar() { try { return ((char) buffer.read()); } catch (Exception e) { } return '\0'; } int nextInt() { return Integer.parseInt(next()); } long nextLong() { return Long.parseLong(next()); } double nextDouble() { return Double.parseDouble(next()); } }
f. 字符串 和 字符数组
这里要明白一点,Java中的String类是不能随便进行修改的,但是可以转化为字符数组来使用
//ch = st.toCharArray(); 字符串转换为字符数组. //st=st.substring(2, 4); 从第2位copy到第4位(不包括第4位) import java.io.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner cin = new Scanner (new BufferedInputStream(System.in)); String st = "abcdefg"; System.out.println(st.charAt(0)); // st.charAt(i)就相当于st[i]. char [] ch; ch = st.toCharArray(); // 字符串转换为字符数组. for (int i = 0; i < ch.length; i++){ ch[i] += 1;//字符数组可以像C++ 一样操作 } System.out.println(ch); // 输入为“bcdefgh”. st = st.substring(1); // 则从第1位开始copy(开头为第0位). System.out.println(st); st=st.substring(2, 4); //从第2位copy到第4位(不包括第4位) System.out.println(st);//输出“de” } }
G. BigInteger类----神一样的存在
神一样的方法。。。都很有用(下面提供了BigInteger所有的方法)
BigInteger abs() 返回其值是此 BigInteger 的绝对值的 BigInteger。 BigInteger add(BigInteger val) 返回其值为 (this + val) 的 BigInteger。 BigInteger and(BigInteger val) 返回其值为 (this & val) 的 BigInteger。 BigInteger andNot(BigInteger val) 返回其值为 (this & ~val) 的 BigInteger。 int bitCount() 返回此 BigInteger 的二进制补码表示形式中与符号不同的位的数量。 int bitLength() 返回此 BigInteger 的最小的二进制补码表示形式的位数,不包括 符号位。 BigInteger clearBit(int n) 返回其值与清除了指定位的此 BigInteger 等效的 BigInteger。 int compareTo(BigInteger val) 将此 BigInteger 与指定的 BigInteger 进行比较。 BigInteger divide(BigInteger val) 返回其值为 (this / val) 的 BigInteger。 BigInteger[] divideAndRemainder(BigInteger val) 返回包含 (this / val) 后跟 (this % val) 的两个 BigInteger 的数组。 double doubleValue() 将此 BigInteger 转换为 double。 boolean equals(Object x) 比较此 BigInteger 与指定的 Object 的相等性。 BigInteger flipBit(int n) 返回其值与对此 BigInteger 进行指定位翻转后的值等效的 BigInteger。 float floatValue() 将此 BigInteger 转换为 float。 BigInteger gcd(BigInteger val) 返回一个 BigInteger,其值是 abs(this) 和 abs(val) 的最大公约数。 int getLowestSetBit() 返回此 BigInteger 最右端(最低位)1 比特的索引 (即从此字节的右端开始到本字 节中最右端 1 比特之间的 0 比特的位数)。 int hashCode() 返回此 BigInteger 的哈希码。 int intValue() 将此 BigInteger 转换为 int。 boolean isProbablePrime(int certainty) 如果此 BigInteger 可能为素数,则返回 true,如果它一定为合数,则返回 false。 long longValue() 将此 BigInteger 转换为 long。 BigInteger max(BigInteger val) 返回此 BigInteger 和 val 的最大值。 BigInteger min(BigInteger val) 返回此 BigInteger 和 val 的最小值。 BigInteger mod(BigInteger m) 返回其值为 (this mod m) 的 BigInteger。 BigInteger modInverse(BigInteger m) 返回其值为 (this-1 mod m) 的 BigInteger。 BigInteger modPow(BigInteger exponent, BigInteger m) 返回其值为 (thisexponent mod m) 的 BigInteger。 BigInteger multiply(BigInteger val) 返回其值为 (this * val) 的 BigInteger。 BigInteger negate() 返回其值是 (-this) 的 BigInteger。 BigInteger nextProbablePrime() 返回大于此 BigInteger 的可能为素数的第一个整数。 BigInteger not() 返回其值为 (~this) 的 BigInteger。 BigInteger or(BigInteger val) 返回其值为 (this | val) 的 BigInteger。 BigInteger pow(int exponent) 返回其值为 (thisexponent) 的 BigInteger。 static BigInteger probablePrime(int bitLength, Random rnd) 返回有可能是素数的、具有指定长度的正 BigInteger。 BigInteger remainder(BigInteger val) 返回其值为 (this % val) 的 BigInteger。 BigInteger setBit(int n) 返回其值与设置了指定位的此 BigInteger 等效的 BigInteger。 BigInteger shiftLeft(int n) 返回其值为 (this << n) 的 BigInteger。 BigInteger shiftRight(int n) 返回其值为 (this >> n) 的 BigInteger。 int signum() 返回此 BigInteger 的正负号函数。 BigInteger subtract(BigInteger val) 返回其值为 (this - val) 的 BigInteger。 boolean testBit(int n) 当且仅当设置了指定的位时,返回 true。 byte[] toByteArray() 返回一个字节数组,该数组包含此 BigInteger 的二进制补码表示形式。 String toString() 返回此 BigInteger 的十进制字符串表示形式。 String toString(int radix) 返回此 BigInteger 的给定基数的字符串表示形式。 static BigInteger valueOf(long val) 返回其值等于指定 long 的值的 BigInteger。 BigInteger xor(BigInteger val) 返回其值为 (this ^ val) 的 BigInteger。
1. 万恶的 StreamTokenizer
// StreamTokenizer的用法 查阅API: java.lang.Object 继承者 java.io.StreamTokenizer StreamTokenizer 类获取输入流并将其分析为"标记"(Token) 允许一次读取一个标记。 分析过程由一个表和许多可以设置为各种状态的标志控制。该流的标记生成器可以识别标识符、数字、引用的字符串和各种注释样式。 另外,一个实例还有四个标记 (返回值是int型) TT_EOF 指示已读到流末尾的常量 TT_EOL 指示已读到行末尾的常量 TT_NUMBER 指示已读到的一个数字标记的常量 TT_WORD 指示已读到的一个文字标记的常量 然后还有几个字段 nval ( Double 型 ) 如果当前标记是一个数字,则此字段将包含该数字的值。 sval (String 型 ) 如果当前标记是一个文字标记,则此字段包含一个给出该文字标记的字符的字符串。 ttype (int型,对于那个前面的四个标记) 在调用 nextToken 方法之后,此字段将包含刚读取的标记的类型。
// 构造方法摘要 Reader r = new BufferedReader(new InputStreamReader(is)); StreamTokenizer st = new StreamTokenizer(r); StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
import java.io.*; public class StreamTokenizerDemo { public static void main(String[] args) { String text = "Hello. This is a text \n that will be split " + "into tokens. 1+1=2"; try { // create a new file with an ObjectOutputStream FileOutputStream out = new FileOutputStream("test.txt"); ObjectOutputStream oout = new ObjectOutputStream(out); // write something in the file oout.writeUTF(text); oout.flush(); // create an ObjectInputStream for the file we created before ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt")); // create a new tokenizer Reader r = new BufferedReader(new InputStreamReader(ois)); StreamTokenizer st = new StreamTokenizer(r); // print the stream tokens boolean eof = false; do { int token = st.nextToken(); switch (token) { case StreamTokenizer.TT_EOF: System.out.println("End of File encountered."); eof = true; break; case StreamTokenizer.TT_EOL: System.out.println("End of Line encountered."); break; case StreamTokenizer.TT_WORD: System.out.println("Word: " + st.sval); break; case StreamTokenizer.TT_NUMBER: System.out.println("Number: " + st.nval); break; default: System.out.println((char) token + " encountered."); if (token == '!') { eof = true; } } } while (!eof); } catch (Exception ex) { ex.printStackTrace(); } } }
import java.util.*; //输入输出需要用到 import java.math.*; //大数类在math里面 import java.io.*;//BufferedInpitStream需要用到 public class Main{ public static void main(String[] args) throws IOException{ //cin.nextTokenizer可能会抛出异常 //调试用的文件输入输出 /*FileInputStream fin = new FileInputStream("in.txt") ; PrintStream fout = new PrintStream("out.txt"); System.setIn(fin); System.setOut(fout); */ int num = 100; String s = new String("whiteblock63"); String ss = String.valueOf(s); String sss = String.valueOf(num); System.out.println(ss); System.out.println(sss); int bb = Integer.parseInt(sss,10); System.out.println("bb = " + bb); BigInteger mm = BigInteger.valueOf(100); String mmm = mm.toString(2); System.out.println(mmm); Double xx = 100.1; String s1,s2, s3; BigInteger cc = BigInteger.valueOf(101); s2 = cc.toString(2); s3 = cc.toString(10); System.out.println(s2); System.out.println(s3); StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out)); cin.nextToken(); //cout.printf("t = %d\n",t); int type = cin.nextToken(); int t = (int)cin.nval; cout.printf("type = %d\n",type); for(int i=1;i<=t;i++){ if(type == cin.TT_EOF) break; if(i != 1) cout.printf("\n"); type = cin.nextToken(); if( type == cin.TT_EOL) type = cin.nextToken(); //cout.printf("type = %d\n",type); String tmp = cin.toString(); BigInteger a = new BigInteger(tmp,2); type = cin.nextToken(); if( type == cin.TT_EOL) type = cin.nextToken(); //cout.printf("type = %d\n",type); tmp = cin.toString(); BigInteger b = new BigInteger(tmp,2); cout.printf("Case %d:\n",i); cout.println(a + "+" + b +" = " + a.add(b)); } /* for(int i=1;i<=t;i++){ if( i != 1) cout.printf("\n"); type = cin.nextToken(); if(type == StreamTokenizer.TT_NUMBER){ String ss = Double.toString(cin.nval); a = new BigInteger(ss); } else { a = new BigInteger(cin.sval); } if(type == StreamTokenizer.TT_NUMBER){ String sss = Double.toString(cin.nval); b = new BigInteger(sss); } else { b = new BigInteger(cin.sval); } cout.printf("Case %d:\n",i); cout.println(a + "+" + b +" = " + a.add(b)); } */ cout.flush(); cout.close(); } } /* 1. 普通的输入 Scanner cin = new Scanner(new BufferedInputStream(System.in)) cin.close(); 2.如何读入 hasNext() next() nextInt(); nextLine(); nextDouble(); nextBigInteger 3.输出 double d; d=9999.99999; System.out.format("%f",d); //9999.999990 没有回车 System.out.format("%10.10f",d).println(); //9999.9999900000 输出回车 System.out.format("%.4f",d).println(); //10000.0000 输出回车 System.out.format("%3.4f",d).println(); //10000.0000 输出回车 System.out.println(d); //输出当前变量 输出回车 System.out.println(); // 输出回车 System.out.printf("%f",d); //9999.999990 没有回车 System.out.print(d); //9999.99999 没有回车 4.高精度 x.add(y); x.subtract(y); x.multiply(y); x.divide(y); x.mod(y); x.gcd(y); 5.进制转换 */
2. 丧心病狂的 StringTokenizer
string tokenizer 类允许应用程序将字符串分解为标记。tokenization 方法比 StreamTokenizer
类所使用的方法更简单。StringTokenizer
方法不区分标识符、数和带引号的字符串,它们也不识别并跳过注释。
可以在创建时指定,也可以根据每个标记来指定分隔符(分隔标记的字符)集合。
StringTokenizer
的实例有两种行为方式,这取决于它在创建时使用的 returnDelims
标志的值是 true
还是 false
:
false
,则分隔符字符用来分隔标记。标记是连续字符(不是分隔符)的最大序列。true
,则认为那些分隔符字符本身即为标记。因此标记要么是一个分隔符字符,要么是那些连续字符(不是分隔符)的最大序列。StringTokenizer 对象在内部维护字符串中要被标记的当前位置。某些操作将此当前位置移至已处理的字符后。
通过截取字符串的一个子串来返回标记,该字符串用于创建 StringTokenizer 对象。
a. 构造函数
StringTokenizer(String str) 为指定字符串构造一个 string tokenizer。 StringTokenizer(String str, String delim) StringTokenizer(String str, String delim, boolean returnDelims)
public StringTokenizer(String str) 为指定字符串构造一个 string tokenizer。tokenizer 使用默认的分隔符集合 " \t\n\r\f",即:空白字符、制表符、换行符、回车符和换页符。分隔符字符本身不作为标记。 参数: str - 要分析的字符串。 抛出: NullPointerException - 如果 str 为 null。 public StringTokenizer(String str, String delim) 为指定字符串构造一个 string tokenizer。delim 参数中的字符都是分隔标记的分隔符。分隔符字符本身不作为标记。 注意,如果 delim 为 null,则此构造方法不抛出异常。但是,尝试对得到的 StringTokenizer 调用其他方法则可能抛出 NullPointerException。 参数: str - 要分析的字符串。 delim - 分隔符。 抛出: NullPointerException - 如果 str 为 null。
b. 方法摘要
int countTokens() 计算在生成异常之前可以调用此 tokenizer 的 nextToken 方法的次数。 boolean hasMoreElements() 返回与 hasMoreTokens 方法相同的值。 boolean hasMoreTokens() 测试此 tokenizer 的字符串中是否还有更多的可用标记。 Object nextElement() 除了其声明返回值是 Object 而不是 String 之外,它返回与 nextToken 方法相同的值。 String nextToken() 返回此 string tokenizer 的下一个标记。 String nextToken(String delim) 返回此 string tokenizer 的字符串中的下一个标记。
3. 快速方便的BufferedReader
下面是金策工业综合大学5047的模板,BufferedReader支持read() 读取单个字符 readLine()读取一行,具体的可以在适当的时候使用,因为这里的输入是每一行给定一个数,那么完全可以直接读一行,让后直接转换为BigInteger就可以了,然后就,,就AC了,貌似是全场AC的JAVA代码里面最快的
import java.io.*; import java.math.*; public class Main{ public static BufferedReader cin=new BufferedReader(new InputStreamReader(System.in)); public static BufferedWriter cout=new BufferedWriter(new OutputStreamWriter(System.out)); public static void main(String []args) throws Exception{ int T=Integer.parseInt(cin.readLine()); for(int nkase=1;nkase<=T;nkase++){ cout.write("Case #"+nkase+": "); BigInteger N=new BigInteger(cin.readLine()); BigInteger ans=N.multiply(N).multiply(BigInteger.valueOf(8)).subtract(
N.multiply(BigInteger.valueOf(7))).add(BigInteger.valueOf(1)); cout.write(ans.toString()); cout.newLine(); } cout.flush(); cout.close(); } }
a. 构造函数
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。 BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
b. 方法摘要
void close() 关闭该流。 void mark(int readAheadLimit) 标记流中的当前位置。 boolean markSupported() 判断此流是否支持 mark() 操作(它一定支持)。 int read() 读取单个字符。 int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。 String readLine() 读取一个文本行。 boolean ready() 判断此流是否已准备好被读取。 void reset() 将流重置为最新的标记。 long skip(long n) 跳过字符。
4. 萌萌的模板君
比赛的时候可以使用这个模板,相当给力的说
import java.io.*; import java.math.BigInteger; import java.util.*; public class Main { static PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(System.out))); public static void main(String[] args) throws IOException { Scan scan = new Scan(); int t = scan.nextInt(); for (int c = 1; c <= t; c++) { String s = scan.next(); BigInteger a = new BigInteger(s,2); s = scan.next(); BigInteger b = new BigInteger(s,2); out.println("Case #" + c + ": " + a.gcd(b).toString(2)); } out.flush(); } } class Scan { BufferedReader buffer; StringTokenizer tok; Scan() { buffer = new BufferedReader(new InputStreamReader(System.in)); } boolean hasNext() { while (tok == null || !tok.hasMoreElements()) { try { tok = new StringTokenizer(buffer.readLine()); } catch (Exception e) { return false; } } return true; } String next() { if (hasNext()) return tok.nextToken(); return null; } String nextLine() { String s = null; try { s = buffer.readLine(); } catch (Exception e) { return null; } return s; } char nextChar() { try { return ((char) buffer.read()); } catch (Exception e) { } return '\0'; } int nextInt() { return Integer.parseInt(next()); } long nextLong() { return Long.parseLong(next()); } double nextDouble() { return Double.parseDouble(next()); } }
import java.io.*; import java.util.*; import java.math.*; public class Main{ static PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(System.out))); public static void main(String [] args) throws IOException{ Scan scan = new Scan(); BigInteger [] co = new BigInteger[21]; co[0] = BigInteger.ZERO; co[1] = BigInteger.ZERO; co[2] = BigInteger.ONE; co[3] = BigInteger.valueOf(2); int i, j; for(i=4;i<=20;i++){ co[i] = (co[i-1].add(co[i-2])).multiply(BigInteger.valueOf(i-1)); //out.println(co[i]); } BigInteger [] fa = new BigInteger[21]; fa[0] = BigInteger.ONE; fa[1] = BigInteger.ONE; for(i =2;i<=20;i++){ fa[i] = fa[i-1].multiply(BigInteger.valueOf(i)); //out.println(fa[i]); } int t = scan.nextInt(); for(j=0;j<t;j++){ int n = scan.nextInt(); int m = scan.nextInt(); BigInteger ans = fa[n].divide(fa[n-m].multiply(fa[m])).multiply(co[m]); out.println(ans); } out.flush(); out.close(); } } class Scan{ BufferedReader buffer; StringTokenizer tok; Scan(){ buffer = new BufferedReader(new InputStreamReader(System.in)); } boolean hasNext(){ while(tok == null || !tok.hasMoreElements()){ try{ tok = new StringTokenizer(buffer.readLine()); }catch(Exception e){ return false; } } return true; } String next(){ if(hasNext()){ return tok.nextToken(); } return null; } String nextLine(){ String s = null; try{ s = buffer.readLine(); }catch (Exception e) { return null; } return s; } char nextChar(){ try{ return ((char)buffer.read()); }catch (Exception e) { } return '\0'; } int nextInt(){ return Integer.parseInt(next()); } long nextLone(){ return Long.parseLong(next()); } double nextDouble(){ return Double.parseDouble(next()); } }
import java.io.*; import java.util.*; import java.math.*; public class Main{ static PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(System.out))); public static void main(String [] args) throws IOException{ Scan scan = new Scan(); BigInteger [] catalan = new BigInteger[110]; catalan[0] = BigInteger.ONE; catalan[1] = BigInteger.ONE; int i,t; for(i=2;i<=100;i++){ t = 4*i-2; BigInteger a = BigInteger.valueOf(t); t = i+1; BigInteger b = BigInteger.valueOf(t); catalan[i] = catalan[i-1].multiply(a).divide(b); } while(scan.hasNext()){ t = scan.nextInt(); if(t == -1) break; out.println(catalan[t]); } out.flush(); out.close(); } } class Scan{ BufferedReader buffer; StringTokenizer tok; Scan(){ buffer = new BufferedReader(new InputStreamReader(System.in)); } boolean hasNext(){ while(tok == null || !tok.hasMoreElements()){ try{ tok = new StringTokenizer(buffer.readLine()); }catch(Exception e){ return false; } } return true; } String next(){ if(hasNext()){ return tok.nextToken(); } return null; } String nextLine(){ String s = null; try{ s = buffer.readLine(); }catch (Exception e) { return null; } return s; } char nextChar(){ try{ return ((char)buffer.read()); }catch (Exception e) { } return '\0'; } int nextInt(){ return Integer.parseInt(next()); } long nextLone(){ return Long.parseLong(next()); } double nextDouble(){ return Double.parseDouble(next()); } }
当然,不要忘记一个外挂一样的存在,输入输出挂
void scan( int &x ) { char c; while( c = getchar(), c < '0' || c > '9' ); x = c - '0'; while( c = getchar(), c >= '0' && c <= '9' ) x = x*10 + c - '0'; } void out( int x ) { if( x > 9 ) out( x/10 ); putchar( x%10 + '0' ); }