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