PTA 判断素数 Java
本题的目标很简单,就是判断一个给定的正整数是否素数。
输入格式:
输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于231的需要判断的正整数。
输出格式:
对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。
输入样例:
2
11
111
输出样例:
Yes
No
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
Reader.init(System.in);
/*
* 这个方法是网上学习来的,但是一时找不到网址了...
* 简单来说,素数只可能出现在6的倍数的附近,即6的倍数的上一个数字
* 或者下一个数字,对于比6小的数(2、3)单独进行处理
*/
int N = Reader.nextInt();
for (int i = 0; i < N; i++) {
isPrime(Reader.nextInt());
}
}
public static void isPrime(int m) {
if( m == 1){
System.out.println("No");
return;
}
// 2 、 3 单独处理
if(m == 2 || m == 3) {
System.out.println("Yes");
return;
}
// 不在6的倍数两边的一定不是素数
if(m % 6 != 1 && m % 6 != 5) {
System.out.println("No");
return;
}
int sqrt_m = (int)Math.sqrt(m);
//在6的倍数两侧的也可能不是质数
for (int i = 5; i <= sqrt_m; i+=6) {
if(m %i == 0 || m % (i + 2) == 0) {
System.out.println("No");
return;
}
}
// 排除所有 剩下就是素数了
System.out.println("Yes");
}
}
// Class for buffered reading int and double values *//*
class Reader {
static BufferedReader reader;
static StringTokenizer tokenizer;
// ** call this method to initialize reader for InputStream *//*
static void init(InputStream input) {
reader = new BufferedReader(new InputStreamReader(input));
tokenizer = new StringTokenizer("");
}
// ** get next word *//*
static String next() throws IOException {
while (!tokenizer.hasMoreTokens()) {
// TODO add check for eof if necessary
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
static String nextLine() throws IOException {
return reader.readLine();
}
static int nextInt() throws IOException {
return Integer.parseInt(next());
}
static char nextChar() throws IOException {
return next().toCharArray()[0];
}
static float nextFloat() throws IOException {
return Float.parseFloat(next());
}
}