第18講 マルチスレッドプログラミング
第4話 マルチスレッドにによる素数探索
解答例
#include<iostream>
#include<process.h>
#include<math.h>
using namespace std;
const int N=100000000; //定数の定義と初期化
int cn1,cn2,cn3,cn4,cn5,a1[N/10],a2[N/10],a3[N/10],a4[N/10];
/*
a1は5で割ると2余るタイプを収納するグローバル配列
a2は5で割ると4余るタイプを収納するグローバル配列
a3は5で割ると1余るタイプを収納するグローバル配列
a4は5で割ると3余るタイプを収納するグローバル配列
*/
void f1(void *a);
void f2(void *a);
void f3(void *a);
void f4(void *a);
char sh(int a);
int main(){
a1[0]=2;a4[0]=3; //a1は5で割ると2余るタイプの素数を収納するグローバル配列、a4はa1は3で割ると2余るタイプの素数を収納するグローバル配列
cn1=1;cn2=0;cn3=0;cn4=1; //a1は5で割ると2余るタイプの素数と3で割ると2余るタイプの素数はそれぞれ1カウントしている
_beginthread(f1, 0, NULL); //新たなスレッドを起動してそこに関数f1を展開する
_beginthread(f2, 0, NULL); //新たなスレッドを起動してそこに関数f2を展開する
_beginthread(f3, 0, NULL); //新たなスレッドを起動してそこに関数f3を展開する
_beginthread(f4, 0, NULL); //新たなスレッドを起動してそこに関数f4を展開する
int i;
cout<<"5で割ると余りが0のタイプ"<<endl;//この5だけは、スレッドで探索する5で割ると余るが出るタイプとは違う。
cout<<"5"<<endl;
cout<<endl;
cout<<"5で割ると余りが1のタイプ"<<endl;
for(i=0;i<cn3;i++){
if(i!=0 && i%10==0)cout<<endl;
cout<<a3[i]<<" ";
}
cout<<endl;
cout<<endl;
cout<<"5で割ると余りが2のタイプ"<<endl;
for(i=0;i<cn1;i++){
if(i!=0 && i%10==0)cout<<endl;
cout<<a1[i]<<" ";
}
cout<<endl;
cout<<endl;
cout<<"5で割ると余りが3のタイプ"<<endl;
for(i=0;i<cn4;i++){
if(i!=0 && i%10==0)cout<<endl;
cout<<a4[i]<<" ";
}
cout<<endl;
cout<<endl;
cout<<"5で割ると余りが4のタイプ"<<endl;
for(i=0;i<cn2;i++){
if(i!=0 && i%10==0)cout<<endl;
cout<<a2[i]<<" ";
}
cout<<endl;
cout<<"素数が"<<cn1+cn2+cn3+cn4+1<<"個ありました。"<<endl;
}
void f1(void *a){ //5で割ると2余るタイプの素数の探索を任務とする関数
int i;
for(i=7;i<=N;i+=10){
if(sh(i)){
a1[cn1]=i;
cn1++;
}
}
}
void f2(void *a){ //5で割ると4余るタイプの素数の探索を任務とする関数
int i;
for(i=9;i<=N;i+=10){
if(sh(i)){
a2[cn2]=i;
cn2++;
}
}
}
void f3(void *a){ //5で割ると1余るタイプの素数の探索を任務とする関数
int i;
for(i=11;i<=N;i+=10){
if(sh(i)){
a3[cn3]=i;
cn3++;
}
}
}
void f4(void *a){ //5で割ると3余るタイプの素数の探索を任務とする関数
int i;
for(i=13;i<=N;i+=10){
if(sh(i)){
a4[cn4]=i;
cn4++;
}
}
}
char sh(int a){ //素数判定関数。素数のとき1を返し、素数でないとき0を返す。
int i;
for(i=3;i<=(int)sqrt((double)a);i+=2){
if(a%i==0)return(0);
}
return(1);
}
解説は次話で行います。
第3話へ 第5話へ
C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)