GeeksforGeeks articles

Java String IO

2018-12-11  本文已影响0人  gattonero

问题:

判断给定的n个输入中,能被m整除的数字的数量

输入

7 3
1
51
966369
7
9
999996
11

输出

4

解决:

Scanner

使用指定的输入流创建Scanner,使用内置的nextInt,nextLong等方法读取基本类型的值,其内部通过正则表达式来读取不同的类型,速度慢

Scanner s = new Scanner(System.in); 
int n = s.nextInt(); 
int k = s.nextInt(); 
int count = 0; 
while (n-- > 0) 
{ 
    int x = s.nextInt(); 
    if (x%k == 0) 
       count++; 
}  
System.out.println(count); 

特别需要注意的是,Scanner的nextLine方法是读取当前输入流中剩余部分一直到换行符之间的字符串,返回值中再把换行符扔掉,但nextInt等方法会无视所有换行符,读取所需的字符串(也就是不一定会读换行符)

Scanner s = new Scanner(System.in);
int first = s.nextInt();
int second = Integer.parseInt(s.nextLine());

System.out.println(first+" "+second);

对于输入

1
2

这段代码并不会输出

1 2

相反,会抛出一个异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""

因为nextLine实际上只读了一个换行符,这种问题处理起来很简单,但实际上仍然会一不小心遇到,所以尽量就少用Scanner(根源其实在于nextLine是按行解析,而nextXXX方法是按正则匹配的,不要混用)

BufferedReader

从字符流中读取字符,缓存字符并提供对字符,数组和行的高效读取。快速,但相对繁琐,需要手动转换数据类型

BufferedReader br = new BufferedReader( 
                      new InputStreamReader(System.in)); 
//先读取行,再用StringTokenizer读取每个token
StringTokenizer st = new StringTokenizer(br.readLine()); 
int n = Integer.parseInt(st.nextToken()); 
int k = Integer.parseInt(st.nextToken()); 
int count = 0; 
while (n-- > 0) 
{ 
    int x = Integer.parseInt(br.readLine()); 
    if (x%k == 0) 
       count++; 
} 
System.out.println(count); 

Tips

https://www.geeksforgeeks.org/difference-between-scanner-and-bufferreader-class-in-java/
https://www.geeksforgeeks.org/fast-io-in-java-in-competitive-programming/

上一篇 下一篇

猜你喜欢

热点阅读