L1-028 判断素数(10分)[java][python]

7 阅读2分钟

题目ID:L1-028 分数:10分 语言:Java / Python

题目描述

判断一个给定的正整数是否素数。

输入格式

输入在第一行给出一个正整数 N(≤ 10),随后 N 行,每行给出一个小于 2³¹ 的需要判断的正整数。

输出格式

对每个需要判断的正整数,如果它是素数,则在一行中输出 Yes,否则输出 No

样例

输入

2
11
111

输出

Yes
No

解题思路

素数定义:大于1的自然数中,只能被1和自身整除的数。

判断方法

  • 对于数 x,只需检查 2 到 √x 之间的所有整数是否能整除 x
  • 如果存在能整除的数,则不是素数
  • 时间复杂度:O(N × √x)

边界处理

  • 1 不是素数
  • 2 是素数

Java 优化

  • √x = (int) Math.sqrt(x) + 1
  • 注意 2 需要特殊处理(2 是最小的素数)

代码实现

Java

import java.io.*;
import java.util.*;

public class Main {
    public static boolean isPrime(int x) {
        if (x < 2) return false;
        if (x == 2) return true;
        if (x % 2 == 0) return false;
        int sqrt = (int) Math.sqrt(x) + 1;
        for (int i = 3; i < sqrt; i += 2) {
            if (x % i == 0) return false;
        }
        return true;
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine().trim());
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) {
            int x = Integer.parseInt(br.readLine().trim());
            sb.append(isPrime(x) ? "Yes" : "No").append('\n');
        }
        System.out.print(sb.toString());
    }
}

Python

import math

def is_prime(x):
    if x < 2:
        return False
    if x == 2:
        return True
    if x % 2 == 0:
        return False
    limit = int(math.sqrt(x)) + 1
    for i in range(3, limit, 2):
        if x % i == 0:
            return False
    return True

n = int(input())
for _ in range(n):
    x = int(input())
    print("Yes" if is_prime(x) else "No")

运行验证

样例验证

输入

2
11
111
  • 11:只能被1和11整除 → 素数 → Yes
  • 111 = 3 × 37 → 不是素数 → No

更多测试

输入结果说明
1No1不是素数
2Yes2是最小素数
3Yes素数
4No4=2×2
9No9=3×3
97Yes素数

复杂度分析

  • 时间复杂度:O(N × √x),每次判断最多检查到 √x
  • 空间复杂度:O(1)

总结

素数判断是经典问题,注意边界条件(1和2的处理)以及只需要检查到 √x 即可。