欧拉筛java
时间: 2025-05-18 09:03:41 浏览: 22
### 关于欧拉筛法的Java实现
欧拉筛法是一种高效的算法,用于筛选出小于等于指定整数 \( n \) 的所有质数。它的时间复杂度接近线性,因此非常适合处理大规模数据的情况[^4]。
以下是基于提供的参考资料中的代码示例[^3],并对其进行解释:
#### 欧拉筛法的核心逻辑
1. 使用两个数组 `is_prime` 和 `prime`。
- `is_prime[i]` 表示数字 \( i \) 是否为合数(初始设为 0 表示未知状态;1 表示已知为合数)。
- `prime[]` 存储找到的所有质数。
2. 遍历从 2 到 \( n \),如果当前数字未被标记为合数,则将其视为质数,并存入 `prime[]` 数组。
3. 对于每个质数 \( p \),尝试将 \( i \times p \) 标记为合数。为了防止重复标记,当满足条件 \( i \% p == 0 \) 时停止进一步操作。
下面是完整的 Java 实现代码:
```java
import java.util.Scanner;
public class EulerSieve {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个正整数 n:");
int n = scanner.nextInt();
// 初始化辅助数组
int[] is_prime = new int[n + 1];
int[] prime = new int[n + 1];
Arrays.fill(is_prime, 0); // 默认假设所有数都是质数
// 特殊情况:0 和 1 不是质数
is_prime[0] = 1;
is_prime[1] = 1;
int count = 0; // 质数计数器
for (int i = 2; i <= n; i++) {
if (is_prime[i] == 0) { // 如果 i 是质数
prime[count++] = i; // 将其加入到质数列表中
}
// 更新合数标志位
for (int j = 0; j < count && i * prime[j] <= n; j++) {
is_prime[i * prime[j]] = 1; // 标记 i * prime[j] 为合数
// 当前 i 可以表示为某个较小质数的倍数时退出循环
if (i % prime[j] == 0) {
break;
}
}
}
// 输出所有的质数
System.out.println("小于等于 " + n + " 的所有质数为:");
for (int i = 0; i < count; i++) {
System.out.print(prime[i] + " ");
}
}
}
```
上述代码实现了欧拉筛法的功能,能够高效地找出范围内的所有质数。
---
### § 相关问题 §
1. 如何优化欧拉筛法使其适用于更大的输入范围?
2. 在实际应用中,欧拉筛法相较于埃氏筛法有哪些优势?
3. 欧拉筛法能否扩展应用于其他类型的数值分解问题?
4. 结合 RSA 加密算法,欧拉筛法在寻找大质数方面有何作用?
5. 如何利用欧拉筛法的结果来加速计算欧拉函数?
阅读全文
相关推荐



















