質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

1405閲覧

「オブジェクト指向」与えられた2つの数の素数を求める関数

big000

総合スコア18

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/07/06 11:22

編集2019/07/06 14:18

①一つの数の素数を、全て求める
②配列に格納する。
2つ目の数の素数を、全て求める
配列に格納する。
③重複するものを、取り除き、出力する

といった方法です。
一つ一つの部品は、出来ていますが、全体を組み合わせることが出来ません。

①は、エラトステネスの篩を使いました。
②は、vector に格納しました
③は、sortで、昇順にして、uniqueで重複を取り除き、eraseで、0を消しました。

このvector をcoutすると、素数を上書きして全て求められます。

この関数を一般化(クラス化)して、main関数内で、1個目、2個目の数に対し、それぞれ①②を実行して、最後にまとめて、③を実行する

//basic.h #ifndef Samp_H #define Samp_H #include<vector> class gcd { public: void set(); void into(); vector get(); vector<int> result; private: int M; }; #endif
//basic.cpp #include "basic.h" #include<iostream> #include<vector> #include<iterator> #include<algorithm> #include<functional> using namespace std; void gcd::set() { int num; cin >> num; M = num; } void gcd::into() { int m = 2, n = 0; vector<int>data1; vector<int>result1; vector<int>::iterator d1 = begin(data1); vector<int>::iterator r1 = begin(result1); vector<int>result; for (int i = 0; i <= M + 1; i++) { data1.push_back(1); result1.push_back(0); } data1[0] = 0; data1[1] = 0; int i = 2 * m; /*for (int i = 0; i < data1.size(); i++) { cout<<data1[i]<<""; }*/ do { for (i = 2 * m; i <= M; i += m) { data1[i] = 0; } result1[n] = m; n++; do { m++; } while ((data1[m] == 0) && (m <= M)); } while (m <= M); /*for (vector<int>::iterator l = begin(result1); l != end(result1); l++) { cout << *l << endl; }*/ for (vector<int>::iterator l = begin(result1); l != end(result1); l++) { result.push_back(*l); } l = begin(result1); } std::vector<int> gcd::get() { return result; }
//main.cpp #include "basic.h" using namespace std; int main() { gcd obj1,obj2; vector<int>ppp; obj1.set(); obj1.into(); ppp=obj1.get(); obj2.set(); obj2.into(); ppp = obj2.get(); }

basic.hファイルで、get()で、素数が入っているvector をreturnしたいですが、
型の指定でエラーになります。
vector<int>で良いのでしょうか。

クラスの使い方や、部品のまとめ方?が分からず、詰まっています。

詳しい方にアドバイスを伺いたいです。

以下修正↓
自分が、詰まっている点は、
10→クラスの関数→(2.3.5.7.9)
14→クラスの関数→(2.3.5.7.9.11.13)

これ(2つの結果)をメイン関数で、どうやって、一つの配列なり、ベクターで格納するかです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/07/06 12:51

エラトステネスの篩で約数が求められますか?
Zuishin

2019/07/06 14:25

「一つの数の素数」ではなく「素因数」ではありませんか? 造語を使っていては話が通じません。
guest

回答4

0

ベストアンサー

質問に対してそこだけ回答というのが難しい質問なので、頭の体操がてらまとめて全部私もソースコードを書きました。質問者さんが、それぞれの数ごとに素数を別のvectorに格納したいというのであればこのソースに手を加える必要があります。私の書き方では、指定した数のなかで最も大きな数について素数を求め、あとは表示する関数に任せるという工程になります。言葉では伝えにくいので下にソースを書きます。とりあえずそれをコピペして質問者さんの環境で実行してみて、こういうことでいいのかどうか確かめてください。

lang

1#include<iostream> 2#include<vector> 3#include<algorithm> 4using namespace std; 5 6class Data{ 7 vector<int> input; //inputに値を入力していく 8 9  //inputに入力された数のうち最も大きな数までの素数をanswerに格納する。 10 vector<int> answer; 11public: 12 void PrimeNumber(); //answerに値を格納する 13 void show(int);     //operator<<で使う、引数の値以下までの素数をanswerから表示 14 friend istream &operator>>(istream&, Data&); //inputに入力させる 15 friend ostream &operator<<(ostream&, Data); //answerを表示 16}; 17 18int main(){ 19 Data ans; 20 cin >> ans; 21 ans.PrimeNumber(); 22 cout << ans; 23 24 return 0; 25} 26 27void Data::PrimeNumber(){ 28 //inputに入力された数のうち最も大きな数 29 int max = *max_element(input.begin(), input.end()); 30 int i, j; 31 bool check; //今のところは素数かどうかの判定 32 answer.push_back(2); //2は素数 33 34 for(i = 3; i <= max; i++){ //判定は3からスタート 35 check = true; 36 //その素数の2乗よりiが小さければ判定不要 37 for(j = 0; answer[j] * answer[j] <= i; j++) 38 if(!(i % answer[j])){ //それまでの素数で割り切れたらアウト 39 check = false; 40 break; 41 } 42 43 if(check) answer.push_back(i); //checkがtrueのままならば素数 44 } 45} 46 47void Data::show(int n){ 48 static int max = answer.back(); 49 int temp; //なくてもいい 50 for(int i = 0; (temp = answer[i]) <= n; i++){ 51 cout << temp << ' '; 52 if(temp == max) break;//ここでbreakしないとanswerの格納範囲を超えてしまう 53 } 54 cout << '\n'; 55} 56 57istream &operator>>(istream &stream, Data &dt){ 58 int lim, temp; 59 cout << "何個数字を入力しますか ? :"; stream >> lim; 60 for(int i = 0; i < lim; i++){ 61 cout << i + 1 << "個目の数字: "; stream >> temp; 62 dt.input.push_back(temp); 63 } 64 65 return stream; 66} 67 68//指定した数ごとに素数の格納されたvectorを作るのではなく表示する関数によって制御するという方法 69ostream &operator<<(ostream &stream, Data dt){ //素数を格納したvectorは1個 70 int size = dt.input.size(); //結果がすべてならこの方法がいいと思います 71 for(int i = 0; i < size; i++) dt.show(dt.input[i]); 72 73 return stream; 74}

投稿2019/07/18 13:47

tometome

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

big000

2019/07/18 17:06

素晴らしいです。 回答ありがとうございます。やりたかったことは、回答のようなことです。 元々は、o'reillyの「Modern C++ チャレンジ」という本で、 与えられた数の素数を一覧化していく問題や、約数を求めたいなどの問題でつまずき、上記のような回答を募集しました。 私には、C++11、14、17やその他テクニックで不明点が多いため、問題集より先にリファレンスなどを読もうと、しばらく放置していましたが、ご回答ありがとうございました。 この問題は、いったんクローズします。
guest

0

std::vector<int>vector<int>で受け取れなくて困っている。
ということでしょうか?

昔、古いVisualC++でそのような現象に悩まされた記憶があります。
当時は確かusing namespace std;をやめてstd::vectorに統一する事で解決しました。


ヘッダでは、std::vector<int>と書いたほうがよいです。
vector get();std::vector<int> get();

vector<int>::iterator d1 = begin(data1);
資料が見つかりませんが、
data1のサイズが変わって再割当てされると、d1が無効になったような気がします。

投稿2019/07/07 23:51

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

本当に最小公倍数を求めたいのでしょうか?
最大公約数の間違いではありませんか?

具体的な例で考えてみましょう。

与えられる 2つの数を、12 と 15 とします。

(1) 最小公倍数はいくつですか?
(2) 最大公約数はいくつですか?
(3) 12 の約数をすべて書いてください。
(4) 15 の約数をすべて書いてください。
(5) 12 の倍数を 6個書いてください。
(6) 15 の倍数を 6個書いてください。

追記

質問がタイトルを含めて変更されたようですが、意味不明です。

2つの数が与えられ、それぞれの数について、
その数以下の素数をすべて求め、
2つの素数列に共通するものを求める、
という問題でしょうか?

自分が、詰まっている点は、

10→クラスの関数→(2.3.5.7.9)
14→クラスの関数→(2.3.5.7.9.11.13)
これ(2つの結果)をメイン関数で、どうやって、一つの配列なり、ベクターで格納するかです。

一つの配列にする必要はありません。
共通なのは、小さいほうの 10 の配列です。
数の区切りは「.」より「,」のほうがいいと思います。

投稿2019/07/06 13:52

編集2019/07/07 00:42
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

big000

2019/07/06 14:16

最小公倍数は、一旦、脇に置きました。
guest

0

vector<int>で良いのでしょうか。

良いです。

質問する時には、単に"エラーになります"でなく、エラーメッセージとか、エラーコードを明記するようにした方が解決が早いです。質問した人の考えているところとは違うエラーってのはよくある話なので。

クラスの使い方や、部品のまとめ方?が分からず

これは使いながら、覚えていくものではないかと思います。
最初から、スマートに書ける人は少ないですし、問題次第で最適解は異なります。

投稿2019/07/06 11:43

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問