编写一个程序,求1-n的素数个数。给出两种解法,计算两种写法的求解时间
时间: 2024-09-08 17:04:01 浏览: 78
编写程序计算1到n之间素数的个数可以采用多种方法,这里提供两种常见的解法:暴力法和埃拉托斯特尼筛法(Sieve of Eratosthenes)。
1. 暴力法:
暴力法是最直接的方法,对于每一个数i(2<=i<=n),遍历2到i-1的所有数,检查是否有能被i整除的数。如果没有,则i为素数。
```java
public static int countPrimesBruteForce(int n) {
int count = 0;
for (int i = 2; i <= n; i++) {
boolean isPrime = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
count++;
}
}
return count;
}
```
2. 埃拉托斯特尼筛法:
这是一种更高效的算法,通过创建一个布尔数组来标记是否为素数,然后从最小的素数2开始,将2的倍数都标记为非素数,然后继续下一个未被标记的数,重复此过程。
```java
public static int countPrimesSieve(int n) {
boolean[] isPrime = new boolean[n + 1];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}
int count = 0;
for (boolean prime : isPrime) {
if (prime) count++;
}
return count;
}
```
计算两种写法的求解时间可以通过记录执行前后的时间差来实现。例如,在Java中,可以使用`System.nanoTime()`或者`System.currentTimeMillis()`来记录时间。
注意:以上代码仅作为示例,实际使用时可能需要优化以适应不同的需求和环境。
阅读全文