第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);
}
実行すると
マルチスレッド版
の方が約1.5倍速いわけです。
4スレッドだから、もっと速いはずです。
そこで探査範囲を100000000までとして実験すると
シングルスレッド版
マルチスレッド版
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入門講義(基礎から応用まで)