PTA 判断素数 Java

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());
    }
}

发布了27 篇原创文章 · 获赞 2 · 访问量 1480

猜你喜欢

转载自blog.csdn.net/Samil_Hy/article/details/104196123