第6講 配列の学習
第5話 1次元配列利用による素数探索解答例
コード例
#include<iostream>
#include <math.h>
using namespace std;
using namespace System;
void f();
int main(){
f();
}
void f(){
int i,j,a[100000],h,cn;
a[0]=2;
cn=1;
cout<<a[0]<<" ";
for(i=3;i<10000;i++){
h=1;
for(j=0;j<10000;j++){
if(a[j]>sqrt((double)i))break;
if(i%a[j]==0){
h=0;
break;
}
}
if(h==1){
a[cn]=i;
cout<<a[cn]<<" ";
cn++;
}
}
cout<<endl;
cout<<"素数が"<<cn<<"個ありました。"<<endl;
}
実行例
解説
いろいろ?マークが浮かんでいますよね。
1行1行詳しく解説していきましょう。
まず、cnの役割は何でしょうか。
cnはカウンタです。
何をカウントしているかといいますと、素数の個数です。
a[0]=2;
cn=1;
は2は素数ですので、この次元で1個ということです。
cout<<a[0]<<" ";
は2を表示しています。
for(i=3;i<10000;i++){
h=1;
for(j=0;j<10000;j++){
if(a[j]>sqrt((double)i))break;
if(i%a[j]==0){
h=0;
break;
}
}
if(h==1){
a[cn]=i;
cout<<a[cn]<<" ";
cn++;
}
}
は3から10000までの整数の中にある素数を探させています。
h=1;
のhは1なら素数であり、0なら素数でないの意味をもたせています。
初めは1にしておいて、ひとつでも割りきれる素数が見つかったらh=0にして、
for(j=0;j<10000;j++){
if(a[j]>sqrt((double)i))break;
if(i%a[j]==0){
h=0;
break;
}
}
を強制的に終了させる仕様になっています。
強制的に終了させられず、for文が通常終了した場合h=1は書き換えられませんので、
if(h==1){
a[cn]=i;
cout<<a[cn]<<" ";
cn++;
}
が遂行されます。
気をつけてほしいことはcn++;の位置です。
うっかりすると
if(h==1){
cn++;
a[cn]=i;
cout<<a[cn]<<" ";
}
とやってしまいます。
最初の3は素数です。これは2個目ですからa[1]=3です。
添え字が0から始まるため1個ずれることに注意しましょう
ですから後からのカウントである
if(h==1){
a[cn]=i;
cout<<a[cn]<<" ";
cn++;
}
でなければならないのです。
さて、最初はfor文の上限は10000ぐらいにしましたが、
100000、1000000などでも実験しましょう。
100000の場合はですし、
1000000の場合はです。
78498個の素数をたちどころに求めてしまいます。
コンピュータ恐るべしですね。
さて、次話では3次元配列を利用して、次のような各学期別成績一覧表を作ることにしましょう。
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)