用多线程计算1万以内素数之和与完全数之和的乘积,用java语言写出具体代码并附加代码注释
时间: 2024-05-19 20:11:18 浏览: 110
java代码-使用java解决输出1000以内最大的n个质数及其和。输出形式“质数1+质数2+...+质数n=的源代码
import java.util.ArrayList;
import java.util.List;
public class PrimeAndPerfect {
private static final int MAX = 10000;
private static List<Integer> primeList = new ArrayList<>(); // 存放素数
private static List<Integer> perfectList = new ArrayList<>(); // 存放完全数
private static long result = 0; // 存放最终结果
public static void main(String[] args) throws InterruptedException {
long startTime = System.currentTimeMillis();
// 创建两个线程分别计算素数之和与完全数之和
Thread primeThread = new Thread(new Runnable() {
@Override
public void run() {
int primeSum = 0;
for (int i = 2; i <= MAX; i++) {
if (isPrime(i)) {
primeList.add(i);
primeSum += i;
}
}
System.out.println("素数之和:" + primeSum);
}
});
Thread perfectThread = new Thread(new Runnable() {
@Override
public void run() {
int perfectSum = 0;
for (int i = 2; i <= MAX; i++) {
if (isPerfect(i)) {
perfectList.add(i);
perfectSum += i;
}
}
System.out.println("完全数之和:" + perfectSum);
}
});
primeThread.start();
perfectThread.start();
primeThread.join(); // 等待素数线程执行完毕
perfectThread.join(); // 等待完全数线程执行完毕
// 计算素数之和与完全数之和的乘积
for (int prime : primeList) {
for (int perfect : perfectList) {
result += prime * perfect;
}
}
System.out.println("结果:" + result);
long endTime = System.currentTimeMillis();
System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
}
// 判断一个数是否为素数
private static 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;
}
// 判断一个数是否为完全数
private static boolean isPerfect(int num) {
int sum = 0;
for (int i = 1; i < num; i++) {
if (num % i == 0) {
sum += i;
}
}
return sum == num;
}
}
// 多线程计算素数之和与完全数之和的乘积
// 利用线程的并发执行能力提高计算效率
// 首先创建两个线程分别计算素数之和与完全数之和
// 然后在主线程中等待两个子线程执行完毕
// 最后利用素数列表和完全数列表计算素数之和与完全数之和的乘积
// isPrime方法用于判断一个数是否为素数
// isPerfect方法用于判断一个数是否为完全数
阅读全文