public class Main{ private static boolean isPrime(int n) { if(n < 2) return false; if(n == 2) return true; if(n%2==0) return false; for(int i = 3; i < n; i += 2) if(n%i == 0) return false; return true; } public static void main(String[] args) { serialConcurrency(); } private static void serialConcurrency() { long time = System.currentTimeMillis(); //任务切换标识,1代表A任务,2代表B任务 int task = 1; //计数器 long count1 = 0, count2 = 0; int i=1,j=100001; while (true) { if(task == 1 && i++<=100000) { if(isPrime(i)) count1+=i; task = 2; } else if(task == 2 && j++<=200000) { if(isPrime(j)) count2+=j; task = 1; } else{ break; } } System.out.println("1-100000之间质数和为"+count1); System.out.println("100001-200000之间质数和为"+count2); System.out.println("总耗时:"+(System.currentTimeMillis() - time) + "毫秒"); } }
时间: 2024-02-14 16:09:40 浏览: 24
这段代码是一个Java程序,主要用于计算在1到200000之间的所有质数的和,并使用串行和并行两种方式实现。
在串行方式中,程序使用一个while循环来遍历1到200000之间的所有数字,对于每一个数字,程序判断其是否为质数,如果是,则将其加入到对应的计数器中。最后输出1到100000之间质数和、100001到200000之间质数和以及总耗时。
在并行方式中,程序使用两个线程分别计算1到100000和100001到200000之间的质数和,每个线程独自计算并行执行,最后合并结果并输出总耗时。
需要注意的是,这段代码中的质数判断方法isPrime采用了基本的试除法,即从3到n-1枚举每个数字并判断是否能够整除n。这种方法在处理大量数据时效率较低,可以考虑使用更高效的质数判断算法。
相关问题
import java.io.*; public class PrimeNumberWriter { public static void main(String[] args) { int lowerBound = 1; // 下限 int upperBound = 100; // 上限 String filename = "prime_numbers.dat"; // 文件名 try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(filename))) { for (int i = lowerBound; i <= upperBound; i++) { if (isPrime(i)) { dos.writeInt(i); // 将素数写入文件 } } } catch (IOException e) { e.printStackTrace(); } } // 判断是否为素数 private static boolean isPrime(int n) { if (n <= 1) { return false; } for (int i = 2; i <= Math.sqrt(n); i++) { if (n % i == 0) { return false; } } return true; } } 这段代码为什么没有输出
这段代码没有输出是因为它并没有写任何输出语句。它的作用是将1到100之间的素数写入名为“prime_numbers.dat”的文件中。如果要在控制台输出这些素数,可以在写入文件的同时在控制台输出,如下所示:
```
import java.io.*;
public class PrimeNumberWriter {
public static void main(String[] args) {
int lowerBound = 1; // 下限
int upperBound = 100; // 上限
String filename = "prime_numbers.dat"; // 文件名
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(filename))) {
for (int i = lowerBound; i <= upperBound; i++) {
if (isPrime(i)) {
System.out.println(i); // 在控制台输出素数
dos.writeInt(i); // 将素数写入文件
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 判断是否为素数
private static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
```
在这段代码中,每当发现一个素数时,它会将该素数输出到控制台,并将其写入文件。
public class Main { public static boolean isPrime(int n) { if(n < 2) return false; if(n == 2) return true; if(n%2==0) return false; for(int i = 3; i < n; i += 2) if(n%i == 0) return false; return true; } public static void main(String[] args) throws InterruptedException { long time1 = System.currentTimeMillis(),time2; Task task1 = new Task(1,100000); Task task2 = new Task(100001,200000); Thread thread1 = new Thread(task1); Thread thread2 = new Thread(task2); thread1.start(); thread2.start(); while (thread1.isAlive() || thread2.isAlive()){ Thread.sleep(1); } time2 = System.currentTimeMillis(); System.out.println("总耗时:"+(time2 - time1)+"毫秒"); } } class Task implements Runnable{ private int start; private int end; Task(int start, int end) { this.start = start; this.end = end; } public void run() { long time = System.currentTimeMillis(); long count = 0; for(int i=start;i<=end;++i){ if(Main.isPrime(i)) count+=i; } System.out.println(String.format("%d-%d之间质数和为%d,耗时:%d毫秒",start,end,count,(System.currentTimeMillis()- time))); } }每句加注释
这是一个Java程序,包含一个Main类和一个Task类,代码如下:
```java
public class Main {
// 判断一个数是否为质数
public static boolean isPrime(int n) {
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i < n; i += 2)
if (n % i == 0) return false;
return true;
}
public static void main(String[] args) throws InterruptedException {
long time1 = System.currentTimeMillis(), time2;
// 创建两个任务,分别计算1-100000和100001-200000之间的质数和
Task task1 = new Task(1, 100000);
Task task2 = new Task(100001, 200000);
// 创建两个线程,分别执行两个任务
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
// 启动线程
thread1.start();
thread2.start();
// 等待两个线程执行完毕
while (thread1.isAlive() || thread2.isAlive()) {
Thread.sleep(1);
}
time2 = System.currentTimeMillis();
System.out.println("总耗时:" + (time2 - time1) + "毫秒");
}
}
class Task implements Runnable {
private int start; // 起始数值
private int end; // 结束数值
Task(int start, int end) {
this.start = start;
this.end = end;
}
public void run() {
long time = System.currentTimeMillis();
long count = 0;
// 计算起始数值到结束数值之间的质数和
for (int i = start; i <= end; ++i) {
if (Main.isPrime(i)) count += i;
}
// 输出计算结果和耗时
System.out.println(String.format("%d-%d之间质数和为%d,耗时:%d毫秒", start, end, count, (System.currentTimeMillis() - time)));
}
}
```
其中,Main类的`isPrime`方法用于判断一个数是否为质数,采用了常见的质数判定算法;`main`方法创建了两个任务,分别计算1-100000和100001-200000之间的质数和,创建了两个线程分别执行这两个任务,等待线程执行完毕后输出总耗时;Task类实现了Runnable接口,用于执行具体的任务,其中的`run`方法计算起始数值到结束数值之间的质数和,输出计算结果和耗时。