正解結果は出せるが処理が重い
参考にした例題元 リンクURL
5000番目で約1分弱、10001番目だと約4分半も掛かってしまいます。
public static void main(String[] args) { long start = System.currentTimeMillis(); func(6); // func(6); //0ms //13 // func(10); //1ms //29 // func(100); //5ms //541 // func(1000); //360ms //7919 // func(5000); //54,440ms //48611 'i++; // func(5000); //53,471ms //48611 'i+=2; // func(10001); //262,829ms //104743 'i++; // func(10001); //266,841ms //104743 'i+=2; long end = System.currentTimeMillis(); System.out.println((end - start) + "ms"); System.out.println(); }
ソースコード
java
1 /** 2 * 問題 https://projecteuler.net/problem=7 3 * 最初の6つの素数:2,3,5,7,11,13を列挙すると、6番目の素数は13であることが分かります。 4 * 10001番目の素数は何ですか? 5 * 6 * @param num 自然数num番目の素数を求める 7 */ 8 static void func(int num) { 9 10 List<Integer> list = new ArrayList<Integer>(); 11 list.add(2);//最初の素数2を初期値として格納しておく 12 int i = 1;//最初のループでi=1+2=3となり3から素数判定する 13 14 while (list.size() < num) { 15 i+=2;//偶数をスキップ 16 for (int j = 0; j < list.size(); j++) { 17 if (i % list.get(j) == 0) { 18 break; 19 } else if (!list.contains(i) && j == list.size()-1) { 20 list.add(i);//リストに発見した素数を格納 21 } 22 } 23 } 24 System.out.println(list.size() + ":" + list.get(list.size() - 1)); 25 } 26
出力結果例
6:13
0ms
試したこと
Whileループカウンターのi+=2;にすることで偶数はスキップするようにしました。
速度変化は誤差程度の範囲で特に改善されませんでした。
わからないこと
- 例題なので答えがすぐに表示される解法があるのではないか
- ボトルネックになっているのはどこなのか
- そもそもこれ以上改善の余地があるのか
素数 10001などで検索しましたが改善出来そうなものは見つけられませんでした。
初歩的なことしか実装出来ていないと思いますがアドバイスやヒントなど頂けましたら幸いです。
![guest](/img/icon/icnUserSample.jpg)
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/11 11:53
2018/08/11 12:18
2018/08/11 12:46
2018/08/11 13:13 編集
2018/08/11 13:33
2018/08/11 13:36
2018/08/11 13:48