標籤:
這兩天學了一下JAVA的文法,還沒有學習後面的核心地方,突然間覺得JAVA這門語言很棒,我要在接下來的時間系統的學習一下。就這麼愉快地決定了。
Java對於大數計算這方面的優勢很大。最重要的是代碼量小了(時間複雜度我有點拿不準)。於是針對這兩天對Java的摸索,寫一篇日誌。記錄一下針對ACM來說常用的Java方面的東西。
1、輸入
首先要想輸入需要先包括:
import java.util.Scanner;
我們需要其中的 Scanner類聲明的對象來掃描控制台輸入。
針對A+B來說:(如果看不懂,請自行翻書,都講得很清楚)
import java.util.Scanner;public class Main //必須寫成Main,否則CE{ public static void main(String [] args) { Scanner cin = new Scanner(System.in);//對於Scanner 類聲明對象cin用來掃描控制台輸入 int a = cin.nextInt(); int b = cin.nextInt(); System.out.println(a+b);//輸出a+b cin.close(); }}
讀一個整數: 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(...);
讀一個大數: BigInteger c = cin.nextBigInteger();
如果你想指教輸入一個字元的話,可以這樣:Scanner in = new Scanner(System.in);String str = in.nextLine();char ch = str.charAt(0);System.out.println(ch);
不過需要注意的是它們沒有像scanf一樣有判斷是否輸入到結尾的功能。
這時候需要用一個Scanner類的方法hasnext()來判斷是否輸入到檔案結尾;
import java.math.*;//大數類在Java.math裡面,如果不包括的話聲明不了大數對象import java.util.Scanner;public class Main{ public static void main(String[] args) { BigInteger [] a=new BigInteger[255]; //大數數組,動態開數組 a[0]=BigInteger.ONE; //初始化,這裡我現在還沒看懂,我會寫成a[0]=BigInteger.valueOf(1);把1強制轉換成大數類 a[1]=BigInteger.ONE; a[2]=a[1].add(a[0].add(a[0])); for(int i=3;i<=250;i++) { a[i]=a[i-1].add(a[i-2].add(a[i-2])); } Scanner cin = new Scanner(System.in); //輸入開啟 while(cin.hasNext())//判斷是否檔案結束 { int n=cin.nextInt(); System.out.println(a[n]); //輸出 } cin .close();//輸入關閉 }}
2、輸出:
public class Main { public static void main(String[] args) { // TODO Auto-generated method stub 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 沒有斷行符號 }}
當然,輸出的時候也有對小數位元處理的方法:
0代表當前位向後都是0就輸出0佔位,#代表若當前位向後都是0就不輸出這些位上的數字。
import java.text.DecimalFormat;public class Main { public static void main(String[] args) { double num = 9.999; DecimalFormat p3 = new DecimalFormat("#.00#"); DecimalFormat p4 = new DecimalFormat("#.000#"); DecimalFormat p5 = new DecimalFormat("#.0000#"); System.out.println(p3.format(num));//輸出9.999 System.out.println(p4.format(num));//輸出9.999 System.out.println(p5.format(num));//輸出9.9990 }}
3、高精度
對於大數來說,Java提供了BigDecimal和BigInteger兩個類,都包含在java.math.*裡面。
BigInteger是大整形類,BigDecimal是大浮點型類。
這兩個類產生的對象沒有資料範圍,只要你的電腦記憶體足夠就可以。
下面用BigInteger舉個例子:
import java.math.BigInteger;public class Main { public static void main(String[] args) { int a=6,b=3; BigInteger x,y,z; x=BigInteger.valueOf(a); //轉化賦值 y=BigInteger.valueOf(b); System.out.println(x.add(y)); //加 System.out.println(x.subtract(y)); //減 System.out.println(x.multiply(y)); //乘 System.out.println(x.divide(y)); //除 System.out.println(x.mod(y)); //取餘 }}
4、進位轉換
java一直就是作弊器一般的存在,就像它的進位轉換函式一樣:
public class Main { public static void main(String[] args) { String string; int a=8; int x=2; string = Integer.toString(a, x); //把int型資料轉轉乘X進位數並轉換成string型 System.out.println(string); int b = Integer.parseInt(string, x);//把字串當作X進位數轉換成int型 System.out.println(b); }}
5、字串
Java中的String 和char數組是完全不同的兩種東西。
String中的字元是不能在原位置改變的,要改變必須改變並儲存到新的String裡,或者儲存到char 數組裡再修改
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” }}
JAVA與ACM