2.编写一个程序,求2-n的素数,n由键盘输入,循环变量分别从2到n、2到(int)sqrt(n)分别测出两个循环的所用时间。
时间: 2024-10-07 15:06:38 浏览: 33
为了编写一个程序,用于计算从2到n的素数,并测量当循环范围分别为2到n和2到sqrt(n)时各自所需的时间,你可以按照以下步骤操作:
首先,我们需要导入必要的库,如`java.util.Scanner`用于获取用户输入,以及一些数学相关的库(如果尚未引入的话),比如`Math`来获取平方根。
```java
import java.util.Scanner;
```
然后创建一个函数来判断是否为素数。我们将使用埃拉托斯特尼筛法(Sieve of Eratosthenes)简化过程,只考虑小于等于sqrt(n)的因子。
```java
public boolean isPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
```
接下来,我们编写主函数,获取用户输入的n值,测量两段循环的时间,并打印结果。
```java
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个正整数n:");
int n = scanner.nextInt();
long startTime, endTime;
// 测试第一个循环,从2到n
startTime = System.nanoTime();
for (int i = 2; i <= n; i++) {
if (isPrime(i)) {
// 打印素数或其他处理
System.out.println(i);
}
}
endTime = System.nanoTime();
System.out.printf("从2到n的循环用时: %.6f秒\n", ((endTime - startTime) * 1e-9));
// 测试第二个循环,从2到sqrt(n)
startTime = System.nanoTime();
for (int i = 2; i <= Math.sqrt(n); i++) {
if (isPrime(i)) {
// 只需检查因子即可
for (int j = i * i; j <= n; j += i) {
if (j != i && isPrime(j)) {
System.out.println(j);
}
}
}
}
endTime = System.nanoTime();
System.out.printf("从2到sqrt(n)的循环用时: %.6f秒\n", ((endTime - startTime) * 1e-9));
scanner.close();
}
```
这个程序会请求用户输入一个正整数n,然后计算并打印从2到n和从2到sqrt(n)测试范围内素数查找的时间。记得在实际运行时添加异常处理,以确保用户输入的是有效的数字。
阅读全文