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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

3回答

1154閲覧

どこのコードが間違っているか

AmaG

総合スコア0

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/09/07 19:28

前提・実現したいこと

C++で入力された値より小さい素数を出力するコードを書きたいのですがエラーの解消方法が分かりません

発生している問題・エラーメッセージ

terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 1) >= this->size() (which is 1)

該当のソースコード

C++

1#include <bits/stdc++.h> 2 3using namespace std; 4 5int main() 6{ 7 int N; 8 cin >> N; 9 10 vector<int> num(N); 11 12 for(int i=0; i<N; i++){ 13 num.at(i) = i+1; 14 } 15 16 cout << "2" << endl; 17 18 vector<int> prime = {2}; 19 20 for(int i=0; i<N; i++){ 21 22 for(int j=0; j<prime.size()+1; j++){ 23 24 if(num.at(i+2) % prime.at(j) == 0){ 25 break; 26 } 27 else if(j == prime.size()+1 && num.at(i+2) % prime.at(j) != 0){ 28 prime.push_back(num.at(i+2)); 29 break; 30 } 31 } 32 33 } 34 35 for(int i=0; i<prime.size(); i++){ 36 cout << prime.at(i) <<endl; 37 } 38 39 return 0; 40}

試したこと

エラーメッセージで検索したところどうやら配列の要素数が大きくなりすぎてるようなのですがどこを直せばいいか分かりません、回答よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/09/07 23:59 編集

デバッグ依頼は非推奨質問です。 [推奨していない質問] https://teratail.com/help/avoid-asking 開発環境が何かは知りませんが、要素数の確認などなら、デバッグ実行で変数の値を確認すれば判るでしょう。VisualStudioなら、下記のページを読んでください。 [C++ のデバッグ方法を学習する] https://docs.microsoft.com/ja-jp/visualstudio/debugger/getting-started-with-the-debugger-cpp?view=vs-2019
guest

回答3

0

要素数が大きくなりすぎてる

エラーの意味合い的には、以下のような感じですね。

c++

1vector<int> prime = {2}; 2cout << prime.at(0) << endl; // OK 3cout << prime.at(1) << endl; // NG。要素の範囲外にアクセスしている

今回の質問にあるコードの場合、初回のエラーは下記で発生していました。j が「1」の際にエラーになります。

c++

1if(num.at(i+2) % prime.at(j) == 0){ 2 ^------- ここでエラー

恐らく num.at(i+2) についても、i が 8 になった際に、同様のエラーになるかと思います。
どこでエラーになっているか、デバッガでステップ実行して確認されることをお勧めします。

素数を出力するコード

こちらのサイトが参考になるのでは、と思います。

■ 素数を求めるプログラム
https://tsg.ne.jp/TT/tsg/c/mansaku/P01.html

下記のように書き換えてみた所、素数が出力されることを確認しました。

c++

1vector<int> prime; 2int divisor; 3 4for (int i = 0; i < N; i++) { 5 divisor = 0; 6 for (int j = 1; j <= i; j++) 7 { 8 if (i % j == 0) divisor++; 9 } 10 11 if (divisor == 2) { 12 prime.push_back(i); 13 } 14}

投稿2021/09/07 23:08

cx20

総合スコア4648

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

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

0

vector<int> num(N);
for(int i=0; i<N; i++){
に対して
num.at(i+2)とか、

for(int j=0; j<prime.size()+1; j++){

prime.at(j)
とか。

そもそも、

for(int i=0; i<N; i++){ num.at(i) = i+1; }

以降numは変更されないので、変数にする必要あるかしら?

投稿2021/09/07 22:56

thkana

総合スコア7703

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

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

0

C++

1 for(int i=0; i<N; i++){ 2 for(int j=0; j<prime.size()+1; j++){ 3 if(num.at(i+2) % prime.at(j) == 0){ 4 break; 5 } 6 else if(j == prime.size()+1 && num.at(i+2) % prime.at(j) != 0){ 7 prime.push_back(num.at(i+2)); // ~~~ i+2 が範囲外になる 8 break; 9 } 10 } 11 }

[追記] やってみた:

C++

1#include <iostream> 2#include <vector> 3#include <algorithm> 4 5int main() { 6 using namespace std; 7 8 int N; 9 cin >> N; 10 11 vector<int> prime = {2}; 12 13 // i = 2, 3, 4...N-1 に対し 14 for ( int i = 2; i < N; ++i ) { 15 // 素数表primeに iを割り切るものがなかったら 16 if ( none_of(prime.begin(), prime.end(), 17 [i](int p) { return i % p == 0; }) ) { 18 // iは素数である。 19 prime.push_back(i); 20 } 21 } 22 // 素数表をプリント 23 for ( int p : prime ) { 24 cout << p << endl; 25 } 26 27 return 0; 28}

投稿2021/09/07 22:09

編集2021/09/07 23:20
episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問