【C++】素数判別プログラムのサンプルとvectorの練習
ご無沙汰です、ふくともです。
入力された値を素数かどうか判別するプログラムを組んでみたので載せてみようかと。
前に書いた配列の動的確保より簡単で「C++らしい」コードが書けるコンテナというものを利用してみようと思います。
以下コード
// prime_num.cpp
#include <iostream> // cout,cinなどを使うするために必要
#include <math.h> // 平方根を取得するsqrt関数を使うために必要
#include <vector> // vectorコンテナを使うために必要
using namespace std;
/* こう書いておくことで例えばstd::cout << "hogehoge";を
cout << "hogehoge";に短縮できる(std::が省略できるようになる)*/
bool Prime(unsigned long int n); // 判別関数
int main(void) {
// 入力
unsigned long int n;
cout << "調べたい値:";
cin >> n;
// 入力された値を関数に渡し、返り値に合わせてメッセージを出力
cout << n << "は素数";
if(Prime(n)!=true)
cout << "でない";
cout << endl;
return 0;
}
//判別関数の実装
bool Prime(unsigned long int n){
/* 最小の素数だけ手動で格納
最小の素数は2であり、それ以降の素数は3以上であるためiの初期値は3
nが素数でない場合はnの平方根以下に約数が存在するので、
nの平方根以下のみを調べれば良い
2を除く素数はすべて奇数なのでiは2ずつ増加させる
素数の判別方法はエラトステネスの篩を調べてみると良いと思います*/
vector<int> Primes;
Primes.push_back(2);
for(int i=3; i<=sqrt(n); i+=2){
bool flg=true;
for(int j=0; j<Primes.size(); ++j){
if(i%Primes[j]==0) flg=false;
}
if(flg==true)
Primes.push_back(i);
}
bool flg=true;
for(int i=0; i<Primes.size(); ++i){
/* Primes[0]の2は例外的に格納しているため、
素数かどうかも例外的に判断する
nが2でなくてnの平方根以下の素数で割り切れる場合、nは素数でない*/
if(n%Primes[i]==0){
if(n!=2) flg=false;
break;
}
}
return flg;
}
入力されたnによって配列の必要な要素数が変わるため動的に処理してくれるvectorコンテナを利用します。
宣言:vector<型> オブジェクト名;
最後尾にデータを追加:オブジェクト名.push_back(追加したいデータ)
最後尾のデータを削除:オブジェクト名.pop_back(追加したいデータ)
要素数の取得:オブジェクト名.size()
先頭要素のポインタ取得:オブジェクト名.begin()
最終要素のポインタ取得:オブジェクト名.end()
通常の配列同様にオブジェクト名[要素番号]で要素へのアクセスが可能です。
また、オブジェクトのポインタからメンバにアクセスする際には
ポインタ名.メンバ、ではなく
ポインタ名->メンバでアクセスします。
(->はアロー演算子というものです。)
コンテナと一緒にお約束のように使われるイテレータについてはまた後日別記事にて書こうと思います。
今回はここまで。
2015/12/22 Tue.