素数判断:用试除法判断一个自然数a是不是质数时,用各个质数从小到大依次去除a,如果到某一个质数正好整除,这个a就可以断定不是质数;如果不能整除,当不完全商又小于这个质数时,就不必再继续试除,可以断定a必然是质数.
本程序采用的java thread,创建了两个线程同时对该数是不是素数进行判断,第一个线程用来判断从1到根号(该数)的范围内的奇数能不能整除,如果能的话就是非素数。第二个线程判断从2到根号(该数)的范围内的偶数能不能整除,如果能的话就是非素数,如果不能则是素数。
public class WyThread extends Thread { private int i; private int num; private int flag=0; public int getI() { return i; } public void setI(int i) { this.i = i; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public int getFlag() { return flag; } public void setFlag(int flag) { this.flag = flag; } public WyThread(int i,int num) { this.i=i; this.num=num; } public void run() { for(;i<num;i+=2) { if (flag == 0) { if (num % i == 0 && i != 1) flag = 1; } else break; } } public static void main(String[] args) throws InterruptedException { long c=92331323; int m=(int)Math.sqrt(c); WyThread wy1=new WyThread(1,m); WyThread wy2=new WyThread(2,m); long startTime1=System.currentTimeMillis(); wy1.start(); wy2.start(); wy1.join(); wy2.join(); long endTime1=System.currentTimeMillis(); if(wy1.getFlag()==0&&wy2.getFlag()==0) System.out.println(c+"是素数"); else System.out.println(c+"不是素数!"); System.out.println(endTime1-startTime1); int flag=0; long startTime2=System.currentTimeMillis(); for(int i=1;i<m;i++) { if (flag == 0) { if (c % i == 0 && i != 1) flag = 1; } else break; } if(flag==0) System.out.println(c+"是素数"); else System.out.println(c+"不是素数!"); long endTime2=System.currentTimeMillis(); System.out.println(endTime2-startTime2); System.out.println((endTime2-startTime2)/(endTime1-startTime1)); } }
素数判断:用试除法判断一个自然数a是不是质数时,用各个质数从小到大依次去除a,如果到某一个质数正好整除,这个a就可以断定不是质数;如果不能整除,当不完全商又小于这个质数时,就不必再继续试除,可以断定a必然是质数.
本程序采用的openMp,采用的是parallel for循环的形式进行判断的
// OpenMp.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "omp.h" #include <iostream> #include <math.h> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int m; float c; cin>>c; int flag=0; int c2; m=(int)sqrt(c); #pragma omp parallel { #pragma omp parallel for for(int i=1;i<=m;i+=2) { if(flag==0) { if(c2%i==0&&i!=1) flag=1; } else continue; } #pragma omp parallel for for(int i=2;i<=m;i+=2) { if(flag==0) { if(c2%i==0) flag=1; } else continue; } } if(flag==0) cout<<c<<"是素数"<<endl; else cout<<c<<"不是素数"<<endl; return 0; }
素数判断:用试除法判断一个自然数a是不是质数时,用各个质数从小到大依次去除a,如果到某一个质数正好整除,这个a就可以断定不是质数;如果不能整除,当不完全商又小于这个质数时,就不必再继续试除,可以断定a必然是质数.
本程序采用的javaRunnable,创建了两个线程同时对该数是不是素数进行判断,第一个线程用来判断从1到根号(该数)的范围内的奇数能不能整除,如果能的话就是非素数。第二个线程判断从2到根号(该数)的范围内的偶数能不能整除,如果能的话就是非素数,如果不能则是素数。
public class RunnableSuShu implements Runnable { private int i; private int num; private int flag=0; public int getFlag() { return flag; } public RunnableSuShu(int i,int num) { this.i=i; this.num=num; } @Override public void run() { // TODO Auto-generated method stub for(;i<num;i+=2) { if (flag == 0) { if (num % i == 0 && i != 1) flag = 1; } else break; } } } public class ThreadWy { public static void main(String[] args) { long c=92331323; int m=(int)Math.sqrt(c); RunnableSuShu wy1=new RunnableSuShu(1, m); RunnableSuShu wy2=new RunnableSuShu(2, m); long startTime1=System.currentTimeMillis(); wy1.run(); wy2.run(); long endTime1=System.currentTimeMillis(); if(wy1.getFlag()==0&&wy2.getFlag()==0) System.out.println(c+"是素数"); else System.out.println(c+"不是素数!"); System.out.println(endTime1-startTime1); int flag=0; long startTime2=System.currentTimeMillis(); for(int i=1;i<m;i++) { if (flag == 0) { if (c % i == 0 && i != 1) flag = 1; } else break; } if(flag==0) System.out.println(c+"是素数"); else System.out.println(c+"不是素数!"); long endTime2=System.currentTimeMillis(); System.out.println(endTime2-startTime2); System.out.println((endTime2-startTime2)/(endTime1-startTime1)); } }
素数判断:用试除法判断一个自然数a是不是质数时,用各个质数从小到大依次去除a,如果到某一个质数正好整除,这个a就可以断定不是质数;如果不能整除,当不完全商又小于这个质数时,就不必再继续试除,可以断定a必然是质数.
本程序采用的Win32API,创建了两个线程同时对该数是不是素数进行判断,第一个线程用来判断从1到根号(该数)的范围内的奇数能不能整除,如果能的话就是非素数。第二个线程判断从2到根号(该数)的范围内的偶数能不能整除,如果能的话就是非素数,如果不能则是素数。
四、程序代码
#include "stdafx.h" #include <windows.h> #include <process.h> #include <math.h> #include <iostream> #include <fstream> using namespace std; int m; float c; int flag=0; int c2; HANDLE Thread1,Thread2; void StartThread1(LPVOID param) { for(int i=1;i<=m;i+=2) { if(flag==0) { if(c2%i==0&&i!=1) flag=1; } else break; } } void StartThread2(LPVOID param) { for(int j=2;j<=m;j+=2) { if(flag==0) { if(c2%j==0) flag=1; } else break; } } int _tmain(int argc, _TCHAR* argv[]) { cin>>c; m=sqrt(c); c2=(int)c; Thread1=CreateEvent(NULL,FALSE,FALSE,NULL); //cout<<"1"<<endl; Thread2=CreateEvent(NULL,FALSE,FALSE,NULL); //cout<<"2"<<endl; _beginthread(StartThread1,0,NULL); //cout<<"3"<<endl; _beginthread(StartThread2,0,NULL); //cout<<"4"<<endl; //WaitForSingleObject(Thread2,INFINITE); cout<<"5"<<endl; if(flag==0) cout<<"是素数"<<endl; else cout<<"不是素数"<<endl; cin>>c;//保留输出框 return 0; }
素数判断:用试除法判断一个自然数a是不是质数时,用各个质数从小到大依次去除a,如果到某一个质数正好整除,这个a就可以断定不是质数;如果不能整除,当不完全商又小于这个质数时,就不必再继续试除,可以断定a必然是质数.
本程序采用的.NET,创建了两个线程同时对该数是不是素数进行判断,第一个线程用来判断从1到根号(该数)的范围内的奇数能不能整除,如果能的话就是非素数。第二个线程判断从2到根号(该数)的范围内的偶数能不能整除,如果能的话就是非素数,如果不能则是素数。
/* .NET并行判断一个数是不是素数 */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace DotNetWyYt { class Program { public static int m; public static int c; public static int flag = 0; public static int c2; public static void WithDraw1() { for (int i = 1; i <= m; i += 2) { if (flag == 0) { if (c2 % i == 0 && i != 1) flag = 1; } else break; } } public static void WithDraw2() { for (int j = 2; j <= m; j += 2) { if (flag == 0) { if (c2 % j == 0) flag = 1; } else break; } } static void Main(string[] args) { c = 12323; m = (Int32)Math.Sqrt((double)c); c2 = (int)c; DateTime d1 = new DateTime(); ThreadStart thread1 = new ThreadStart(WithDraw1); Thread newThread1 = new Thread(thread1); ThreadStart thread2 = new ThreadStart(WithDraw2); Thread newThread2 = new Thread(thread2); newThread1.Start(); newThread2.Start(); DateTime d2 = new DateTime(); Console.WriteLine(d2-d1); if (flag == 0) Console.WriteLine(c+"是素数"); else Console.WriteLine(c+"23不是素数"); Console.Read(); } } }