第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);
}
C++
解説は次話で行います。

第3話へ 第5話へ

戻る

C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)