ACM模式下输入输出写法 Java版本
1. 單個輸入與單行輸入
輸入一個數,或者一個字符串,或者一行數中間用空格隔開:
- 輸入一個數
byte/ double/ float/ int/ long/ short 類型的類似。
- 輸入一個字符串
next()、nextLine()都可以:
不過要注意
next()不會吸取字符前/后的空格/Tab鍵,只吸取字符,開始吸取字符(字符前后不算)直到遇到空格/Tab鍵/回車截止吸取;
nextLine()吸取字符前后的空格/Tab鍵,回車鍵截止。
對于相同的輸入: asdad sad ka
str1:asdad
str2: asdad sad ka
- 輸入一個char類型字符
Scanner本身并不支持獲取char類型的數據,但是可以通過charAt()方法截取string的首位來獲取char類型的數據。
- 輸入一行數據or字符串,中間用空格隔開
對于不同數據類型的方法都類似,連續用幾次next()或者nextInt()函數:
輸入:anny tony bani
輸出:a:anny b:tony c:bani
2. 多行輸入(最常見)
- 給出了矩陣的行列數,用for遍歷
第一行是兩個用空格隔開的正整數n與m,n為行數,m為列數。
接下來的n行,每行是m個用空格隔開的正整數。如:
2 3
5 6 8
1 6 9
想要用二維數組接收:
注意在驗證的時候,分隔號一定要用雙引號隔開,單引號字符會參與計算!!
- 沒有給出具體的行列數,用hasNextLine()判斷
有些輸入可能是:
輸入一個矩陣,每行以空格分隔。
1 2 3
56 8 2 9
對于這種沒有給定矩陣行列數的輸入,我們只能按照字符串拆分來進行。
- 輸入數組中帶有中括號和逗號
有些輸入可能是,輸入一個矩陣:
[[3,2,3],
[1,6,5],
[7,8,9]]
對于這種沒有給定矩陣行列數的輸入,而且還包含中括號和逗號的輸入,我們也是只能按照字符串拆分來進行。這里逗號和右中括號是關鍵。
3. 解析逗號分隔符的字符串
輸入用逗號分隔的字符串: 1,5,9,6,5,7,2
想要接收后變成int類型數組:
這里提一下parseInt()與valueOf()的區別:
Integer.parseInt(str)返回值是int型的;
Integer.valueOf(str)返回值是Integer型的。
4. 輸出寫法
System.out.println();//換行打印,輸出之后會自動換行 System.out.print();//不換行打印 System.out.printf();//按格式輸出對于printf:
/*** 輸出字符串 ***/ // %s表示輸出字符串,也就是將后面的字符串替換模式中的%s System.out.printf("%s", new Integer(1212)); // %n表示換行 System.out.printf("%s%n", "end line"); // 還可以支持多個參數 System.out.printf("%s = %s%n", "Name", "Zhangsan"); // %S將字符串以大寫形式輸出 System.out.printf("%S = %s%n", "Name", "Zhangsan");/*** 輸出整數類型***/ Integer iObj = 342; // %d表示將整數格式化為10進制整數 System.out.printf("%d; %d; %d%n", -500, 2343L, iObj); // %o表示將整數格式化為8進制整數 System.out.printf("%o; %o; %o%n", -500, 2343L, iObj); // %x表示將整數格式化為16進制整數 System.out.printf("%x; %x; %x%n", -500, 2343L, iObj); // %X表示將整數格式化為16進制整數,并且字母變成大寫形式 System.out.printf("%X; %X; %X%n", -500, 2343L, iObj);/*** 輸出浮點類型***/ Double dObj = 45.6d; // %f表示以十進制格式化輸出浮點數 System.out.printf("%f; %f; %f%n", -756.403f, 7464.232641d, dObj); // 還可以限制小數點后的位數 System.out.printf("%.1f; %.3f; %f%n", -756.403f, 7464.232641d, dObj);5. 注意點
- 多組測試數據:
如果出現多組測試數據放在一起的情況,直接在最外層套while(sc.hasNext()),每組測試數據進入一次while循環,運行一次主函數。一直等待輸入,除非終止程序。 - 高精度:
BigInteger和BigDecimal可以說是acmer選擇java的首要原因。
函數:add, subtract, divide, mod, compareTo等,其中加減乘除模都要求是BigInteger(BigDecimal)和BigInteger(BigDecimal)之間的運算,所以需要把int(double)類型轉換為BigInteger(BigDecimal),用函數BigInteger.valueOf()。 - 一個非常容易出錯的地方:(nextInt轉nextLine接收)
假設輸入為:
3
a 10 1 2
b 10 2
c 10 3
第一行是是數字n,表示下面有n行輸入,下面的n行有字母,也有數字,字母只是標識符,不參與運算,數字的個數不固定,每一行的數字需要用List存儲下來,最后將每一行的List放入一個大的List中。
錯誤代碼:
import java.util.Scanner; public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); //需要在后面添加sc.nextLine();換到下一行List<List<Integer>> adj = new ArrayList<>();for (int i = 0; i < n; i++) {List<Integer> list = new ArrayList<>();String[] inputs = sc.nextLine().split(" ");for (int j = 1; j < inputs.length; j++) {list.add(Integer.valueOf(inputs[j]));}adj.add(list);}} }后果:adj的第一個元素是一個空ArrayList,輸入的最后一組數據沒有接收到。
原因:當執行int n = sc.nextInt();后,光標還停留在第一行,下面就直接執行sc.nextLine()來接收輸入了,這樣接收的只是第一行n后面的空字符串!
解決方法:在int n = sc.nextInt();后添加sc.nextLine();直接換行
- 賽碼平臺注意點:
不要自定義包名稱,否則會報錯,即不要添加package answer之類的語句;
寫很多個類,但是必須有一個類名為Main,并且為public屬性,并且Main為唯一的public class;
Main類的里面必須包含一個名字為’main’的靜態方法(函數),這個方法是程序的入口。
總結
以上是生活随笔為你收集整理的ACM模式下输入输出写法 Java版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建立功能模型的步骤
- 下一篇: java编程括号匹配,Java正则表达式