问题:
判断给定的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
- BufferedReader是线程同步的,而Scanner不是
- BufferedReader顾名思义,能够缓存的字符(8KB缓存区)大于Scanner(1KB缓存区)
- BufferedReader比Scanner快的原因是它把输入流原样输出,而Scanner则做了处理
https://www.geeksforgeeks.org/difference-between-scanner-and-bufferreader-class-in-java/
https://www.geeksforgeeks.org/fast-io-in-java-in-competitive-programming/







网友评论