1. 程式人生 > >【學習筆記】ACM與Java

【學習筆記】ACM與Java

這兩天遇到了一些關於大資料處理的題目,發現Java對於這方面的優勢很大。最重要的是程式碼量小了。於是針對這兩天對Java的摸索,寫一篇日誌。記錄一下針對ACM來說常用的Java方面的東西。

1、輸入

首先要想輸入需要先包括:

import java.util.*; 

 

我們需要其中的 Scanner類宣告的物件來掃描控制檯輸入。

針對A+B來說:

import java.util.*;
public class Main
{
	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();

不過需要注意的是它們沒有像scanf一樣有判斷是否輸入到結尾的功能。

這時候需要用一個Scanner類的方法hasnext()來判斷是否輸入到檔案結尾;

例如POJ2506 這是一個針對大數處理的遞推題。用Java就很好解決。

import java.math.*;//大數類在Java.math裡面,如果不包括的話宣告不了大數物件
import java.util.*;

public class Main
{
	public static void main(String[] args)
	{

		// TODO Auto-generated method stub
		/*sss*/
		BigInteger [] a=new BigInteger[255]; //大數陣列
		a[0]=BigInteger.ONE; //初始化
		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”
	}
}