题目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✓
更多测试
| 输入 | 结果 | 说明 |
|---|---|---|
| 1 | No | 1不是素数 |
| 2 | Yes | 2是最小素数 |
| 3 | Yes | 素数 |
| 4 | No | 4=2×2 |
| 9 | No | 9=3×3 |
| 97 | Yes | 素数 |
复杂度分析
- 时间复杂度:O(N × √x),每次判断最多检查到 √x
- 空间复杂度:O(1)
总结
素数判断是经典问题,注意边界条件(1和2的处理)以及只需要检查到 √x 即可。