试除法判定质数
- 1.题目
- 2.基本思想
- 3.代码实现
1.题目
给定 n 个正整数 ai,判定每个数是否是质数。
输入格式
第一行包含整数 n n n。
接下来 n n n行,每行包含一个正整数 a i ai ai。
输出格式
共 n n n 行,其中第 i i i 行输出第 i i i 个正整数 a i ai ai 是否为质数,是则输出 Y e s Yes Yes,否则输出 N o No No。
数据范围
1 ≤ n ≤ 100 , 1≤n≤100, 1≤n≤100,
1 ≤ ≤ ≤ a i ai ai ≤ ≤ ≤ 2^31−1
输入样例:
2
2
6
输出样例:
Yes
No
2.基本思想
(试除法) O(√n)
Tips:不推荐写法:
- i < = s q r t ( n ) i <= sqrt(n) i<=sqrt(n) : sqrt 这个函数运行很慢,每次执行时都要运算一遍,所以比较慢
- i ∗ i ≤ n i∗i≤n i∗i≤n :当i的值即将超过int的范围时,你再给它平方,找死吧,很容易溢出
推荐写法:i ≤ n / i
bool is_prime(int n){if(n < 2) return false; //2是最小的质数,如果n小于2,那n肯定就不是质数for(int i = 2;i <= n/i;i ++){ //优化部分if(n % i == 0){ //如果可以被i整除,说明这个数不是质数return false; //返回不是}}return true; //返回是
}
3.代码实现
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();while (n-- > 0) {int ai = sc.nextInt();is_prime(ai);}}private static void is_prime(int ai) {if (ai < 2) {System.out.println("No");return;}for (int i = 2; i <= ai / i; i++) {if (ai % i == 0) {System.out.println("No");return;}}System.out.println("Yes");}
}