第20講 if文以外のループ処理  
第4話 while文による素数探索マルチスレッド版

解答例
#include<iostream>
#include<math.h>
using namespace std;
using namespace System;
using namespace System::Threading;
int cn[4];
void t(Object^ a);
void f(int a);
char h(int a);
int n;
int main(){
  DateTime^ hj=DateTime::Now;
  cout<<"素数の探索範囲をキーボードから入力してください。"<<endl<<"n=";
  scanf("%d",&n);
  cn[0]=1;cn[1]=0;cn[2]=0;cn[3]=0;
  Thread^ a=gcnew Thread(gcnew ParameterizedThreadStart(t));
  Thread^ b=gcnew Thread(gcnew ParameterizedThreadStart(t));
  Thread^ c=gcnew Thread(gcnew ParameterizedThreadStart(t));
  Thread^ d=gcnew Thread(gcnew ParameterizedThreadStart(t));
  a->Start(3);
  b->Start(5);
  c->Start(7);
  d->Start(9);
  a->Join();
  b->Join();
  c->Join();
  d->Join();
  DateTime^ ow=DateTime::Now;
  TimeSpan sa=ow->Subtract(*hj);
  cout<<"1から"<<n<<"までの素数の総数は"<<cn[0]+cn[1]+cn[2]+cn[3]<<"です。"<<endl;
  cout<<"計算時間は"<<sa.TotalSeconds<<"秒です。"<<endl;
}
void t(Object^ a){
  char i;
  i=(Int32)a;
  f(i);
}
void f(int i){
  while(i<=n){
    if(h(i)){
      if(i%8==3)cn[2]++;
      if(i%8==5)cn[0]++;
      if(i%8==7)cn[1]++;
      if(i%8==1)cn[3]++;
    }
    i+=8;
  }
}
char h(int a){
  int i=3;
  while(i<=(int)sqrt((double)a)){
    if(a%i==0)return(0);
    i+=2;
  }
  return(1);
}

実行画面例
入門
時間比較のためシングルスレッドも表示の部分を外して
#include<iostream>
#include<math.h>
using namespace std;
using namespace System;
int cn;
void f(int a);
char h(int a);
int main(){
  int n;
  DateTime^ hj=DateTime::Now;
  cout<<"素数の探索範囲をキーボードから入力してください。"<<endl<<"n=";
  scanf("%d",&n);
  cn=1;
  f(n);
  DateTime^ ow=DateTime::Now;
  TimeSpan sa=ow->Subtract(*hj);
  cout<<"1から"<<n<<"までの素数の総数は"<<cn<<"です。"<<endl;
  cout<<"計算時間は"<<sa.TotalSeconds<<"秒です。"<<endl;
}
void f(int a){
  int i=3;
  //cout<<"2"<<" ";
  while(i<=a){
    if(h(i)){
      //cout<<i<<" ";
      cn++;
    }
    i+=2;
  }
  //cout<<endl;
}
char h(int a){
  int i=3;
  while(i<=(int)sqrt((double)a)){
    if(a%i==0)return(0);
    i+=2;
  }
  return(1);
}
実行すると
C言語
マルチスレッド版
入門
の方が約1.5倍速いわけです。
4スレッドだから、もっと速いはずです。
そこで探査範囲を100000000までとして実験すると
シングルスレッド版
C言語
マルチスレッド版
C++
732÷333=約2.2倍です。
先ほどより効果が大きくなりました。
より探索範囲を広げると効果はもっと大きくなるでしょう。

ループ文には,
do{
      ・
      ・
      ・
}while(条件式);
という形式のdo...while文というものもあります。
while文との違いは、while文が前判定であるのに対して、
do...whileの方は後判定ということです。
次は,do...while文の演習をしてみましょう。
まず、シングルスレッド版の素数探索を
do...while文で書き換えてみましょう。

第3話へ 第5話へ

戻る

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

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