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

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

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

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

Q&A

解決済

3回答

710閲覧

n以下の素数をreturnするコードが遅いので改善したいです。

alizona

総合スコア126

C++

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

1グッド

0クリップ

投稿2020/07/12 04:48

編集2020/07/12 04:59

leet codeというウェブサービスを使って、問題を解いてるのですが、"Time Limit Exceeded"という実行結果が出ます。

どのように改善すれば良いでしょうか?

プログラムの要件は、
引数nより小さくて、負の数値でない素数の数をリターンする。
です。

よろしくお願いします。

C++

1class Solution { 2public: 3 int countPrimes(int n) { 4 //nより小さくて、負の数値でない素数の数をリターンする。 5 6 7 8 int count=0; 9 10 bool isSosu; 11 for(int m=2;m<n;m++){ 12 13 isSosu=true; 14 for(int i=2;i<m;i++){ 15 16 if(m%i==0 && m!=i) //2以上で、同じ数字以外で割り切れた時は素数ではない 17 isSosu=false; 18 19 } 20 21 if(isSosu) 22 count++; 23 } 24 return count; 25 } 26};
MtDeity👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

for(int i=2;i<m;i++){と書いた限り、im未満なので、&& m!=iという条件判断は無駄です。

他には、
・iは、m未満じゃなくて「mの平方根未満」で十分
・調べる対象もfor(int m=2;m<n;m++){のような2以上n未満全整数じゃなくて「2と、n未満の奇数」だけで十分
・そうするとiも奇数だけで十分

投稿2020/07/12 05:11

編集2020/07/12 05:19
otn

総合スコア85901

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

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

alizona

2020/07/12 06:13

教えていただいた3点を守ったところ、動くようになりました。ありがとうございました。
alizona

2020/07/12 06:15 編集

if(n>2) //3以上の時は、2が奇数だから+1する count++; bool isSosu; for(int m=3;m<n;m=m+2){ //対象は3以上の偶数は素数ではない isSosu=true; for(int i=3;i<=sqrt(m);i=i+2){ //偶数はないから2で割る必要ない if(m%i==0){ isSosu=false; i=m;//すでに素数でないことが見つかったので、loopから抜ける } } if(isSosu) count++;
guest

0

例えば、「同じ数字以外で割り切れた時は素数ではない」の判断をする前に、「1桁の素数(2,3,5,7)で割り切れる数は素数でない」という条件で if(m%i==0 && m!=i) の判断をする回数を減らすと、速度が上がると思います。

使う素数の数を増やす(例えば2,3,5,7,11,13,17,19)と割り切れるかどうかの判断をする時間が伸びますが、if(m%i==0 && m!=i) の判断をする回数が減りますから、nが大きい時には使う素数の数をあるていど大きくしたほうが演算時間が短くなります。

投稿2020/07/12 05:10

coco_bauer

総合スコア6915

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

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

alizona

2020/07/12 05:16

"nが大きい時には使う素数の数をあるていど大きくしたほうが演算時間が短くなります" なのですね。勉強になりました。 ありがとうございました。
guest

0

素数の発掘は、効率の良いアルゴリズムがいくつかあるので、調査してみると良いですよ。

投稿2020/07/12 05:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

alizona

2020/07/12 05:14

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問