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))); } }
时间: 2024-03-07 15:51:57 浏览: 50
这段代码是一个Java程序,主要实现的功能是计算1-100000和100001-200000之间的质数和,并输出计算结果和计算耗时。这段代码通过多线程实现并行计算,加快计算速度。
程序中定义了一个Task类,实现了Runnable接口,定义了一个构造函数和一个run方法。构造函数用来初始化任务的起始和结束位置,run方法是任务的主要执行逻辑,用来计算质数和,并输出计算结果和计算耗时。
在主函数中,首先创建两个Task对象,分别用来计算1-100000和100001-200000之间的质数和。然后创建两个Thread对象,并将Task对象传入,启动两个线程。最后通过while循环来判断两个线程是否都执行完毕,如果没有执行完毕,就让主线程休眠1毫秒,等待线程执行完毕。最后输出总的计算耗时。
总的来说,这段代码通过多线程的方式来实现并行计算,加快了计算速度。但是需要注意的是,多线程并不一定比串行计算更快,需要根据具体情况来选择合适的计算方式。同时,在多线程编程中需要注意线程安全的问题。
相关问题
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) + "毫秒"); } }
这段代码是一个Java程序,主要用于计算在1到200000之间的所有质数的和,并使用串行和并行两种方式实现。
在串行方式中,程序使用一个while循环来遍历1到200000之间的所有数字,对于每一个数字,程序判断其是否为质数,如果是,则将其加入到对应的计数器中。最后输出1到100000之间质数和、100001到200000之间质数和以及总耗时。
在并行方式中,程序使用两个线程分别计算1到100000和100001到200000之间的质数和,每个线程独自计算并行执行,最后合并结果并输出总耗时。
需要注意的是,这段代码中的质数判断方法isPrime采用了基本的试除法,即从3到n-1枚举每个数字并判断是否能够整除n。这种方法在处理大量数据时效率较低,可以考虑使用更高效的质数判断算法。
用Java实现import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int b = scanner.nextInt(); for (int i = a; i <= b; i++) { //一个循环从a到b,寻找绝对素数 if (isPrime(i)) { //如果当前数字是素数 int reverseNum = reverse(i); //翻转当前数字 if (reverseNum == i) { //如果翻转后与原数相等,则直接输出 System.out.println(i); } else if (isPrime(reverseNum)) { //否则判断翻转后的数是否是素数 System.out.println(i); } } } } //判断一个数是否为素数 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; } //翻转一个数字 private static int reverse(int n) { int reverseNum = 0; while (n != 0) { reverseNum = reverseNum * 10 + n % 10; n /= 10; } return reverseNum; } }
很好,这是一个Java程序,它的功能是找出a到b之间的绝对素数。绝对素数是指一个素数,其反转数(将该数的各位数字颠倒顺序后得到的数)仍为素数。下面是程序的具体实现:
1. 首先通过Scanner类读取控制台输入的两个整数a和b,表示需要寻找的绝对素数范围。
2. 然后通过for循环从a到b遍历每个整数,判断它是否为素数。
3. 如果当前数字是素数,则调用reverse()方法翻转该数,判断翻转后的数是否为素数。
4. 如果翻转后的数与原数相等,则直接输出该数。
5. 如果翻转后的数也是素数,则输出该数。
6. isPrime()方法用于判断一个数是否为素数,它从2到该数的平方根遍历每个数,如果该数可以整除,则该数不是素数。
7. reverse()方法用于翻转一个数字,它将该数的各位数字颠倒顺序后返回。
希望这个解释对您有帮助。
阅读全文