6 つの連続する奇数 a、a+2、a+4、a+6、a+8、a+10 はすべて合成数です。最小の a に対する総当たり解を求めます。
まず結果を投稿してから、コードを貼り付けます。
1回連続 n=9、連続値数:1、所要時間:0ms、合計:0ms 2回連続n=25、連続値数:1、所要時間:0ms、合計:0ms 3回連続n=91、連続値の数: 1、所要時間: 0 ミリ秒、連続 4 回 n=115、所要時間: 0 ミリ秒、合計: 1ms 5回連続 n=115、消費時間:0ms、合計:1ms 6回連続 n=115、連続値数:3、合計 1ms 7回連続 n=525連続値の数: 2、所要時間: 0ms、合計: 1ms 連続 8 回 n=525、連続値の数: 2、所要時間: 0ms 1ms 連続9回 n=889、連続値1個、所要時間0ms、合計1ms 連続10回 n=1131、所要時間1ms、連続11回 n= 1329、連続 値の数: 6、所要時間: 0 ミリ秒、連続 12 回 n=1329、所要時間: 0 ミリ秒、合計: 1ms 13回連続 n=1329、消費時間:0ms、合計:1ms 14回連続 n=1329、消費時間:0ms、合計 1ms 15回 n= 1329、連続値の数: 6、所要時間: 0 ミリ秒、合計: 1ms 連続回数 n=1329、連続値の数: 6、所要時間: 0ms、合計: 1ms、連続 17 回 n=9553、連続値の数: 1、所要時間: 2ms、合計: 3ms、連続 18 回、n=15685、所要時間の数: 1ms、合計: 5ms、連続19回 n =15685、連続値数:4、消費時間:1ms、合計:5ms20回連続 n=15685、連続値数: 4; 所要時間: 1ms、合計: 5ms、連続 21 回 n=15685、連続値の数: 4; 所要時間: 1ms、合計: 5ms、連続 22 回 n=19611、連続値の数: 4; : 2ms、合計: 8ms 連続23回 n=19611、連続値の数: 4、所要時間: 2ms、合計: 8ms24回連続n=19611、消費時間:2ms、合計:8ms25回連続n=19611、消費時間:2ms、合計8ms26回n=31399、連続値の数: 10、所要時間: 5 ミリ秒、合計: 13 ミリ秒、連続 27 回 n=31399、連続値の数: 10; 所要時間: 5 ミリ秒、合計: 13 ミリ秒、連続 28 回 n=31399、連続値の数: 10; 所要時間: 5 ミリ秒、合計: 13 ミリ秒、連続数 29 回 n=31399、連続値の数: 10; : 5ms、合計: 13ms 連続30回 n=31399、連続値の数: 10、所要時間: 5ms、合計: 13ms31回連続n=31399、消費時間:5ms、合計:13ms32回連続n=31399、消費時間5ms、合計13ms33回n=31399、連続値の数: 10、所要時間: 5 ミリ秒、合計: 13ms34 回連続、n=31399、連続値の数: 10、所要時間: 5ms、合計: 13ms35 回連続、n=31399、連続値の数: 5ms、合計: 13ms36 回、連続値の数: 7、所要時間: 92ms、合計: 105ms37 回連続、n=155923、所要時間: 92ms、合計: 105ms38 回連続、n=155923、所要時間: 92ms、合計: 105ms39 回連続、n=155923、連続値の数: 7、所要時間: 92ms、合計: 105ms40回連続、n=155923、所要時間:92ms、合計:105ms41回連続、n=155923、所要時間:92ms、合計:105ms42回連続、n=155923、連続値の数: 7、所要時間: 93 ミリ秒、合計: 106ms43回連続n=360655、消費時間:243ms、合計:349ms44回連続n=360655、消費時間:243ms、合計数:349ms45回連続n=360655連続値の数: 5; 消費時間: 243ms、合計: 349ms46回連続n=360655、消費時間:243ms、合計:349ms47回連続n=360655、消費時間:243ms、合計数:349ms48回連続n=370263、連続値の数: 8、所要時間: 14ms、合計: 363ms49回連続 n=370263、所要時間:14ms、合計:363ms50回連続 n=370263、所要時間:14ms、合計:363ms51回連続 n=370263、連続値の数: 8; 所要時間: 14ms、合計: 363ms52回連続、n=370263、所要時間:14ms、合計:363ms53回連続、n=370263、所要時間:14ms、合計:363ms54回連続、n=370263、連続値の数: 8; 所要時間: 14ms、合計: 363ms55 回連続、n=370263、所要時間: 14ms、合計: 363ms56 回連続、n=492115、連続所要時間: 185ms、合計: 548ms57 回連続、n=1349535、連続値の数: 2、所要時間: 1854 ミリ秒、合計: 2402ms58回連続n=1349535、消費時間:1854ms、合計:2402ms59回連続n=1357203、連続消費時間:22ms、合計数:2424ms60回連続n=1357203、連続値の数: 7、所要時間: 22 ミリ秒、合計: 2424ms61 連続回数 n=1357203、連続値数: 7、所要時間: 22ms、合計: 2424ms62 連続回数 n=1357203、連続所要時間: 22ms、合計回数: 2424ms63 連続回数 n=1357203、連続値の数: 7、所要時間: 22 ミリ秒、合計: 2424ms64 連続回数 n=1357203、連続値数: 7、所要時間: 22ms、合計: 2424ms65 連続回数 n=1357203、連続所要時間: 22ms、合計回数: 2424ms66 連続回数 n=2010735、連続値の数: 8、所要時間: 1889ms、合計: 4313ms67 連続回数 n=2010735、消費時間: 1889ms、合計: 4313ms68 連続回数 n=2010735、連続消費時間: 1889ms、合計数: 4313ms69 回連続 n=2010735、連続値の数: 8、所要時間: 1889 ミリ秒、合計: 4313ms70 連続回数 n=2010735、連続値の数: 8、所要時間: 1889ms、合計: 4313ms71 連続回数 n=2010735、連続所要時間の数: 8、合計: 4313ms72 連続回数 n=2010735、連続値の数: 8、所要時間: 1889 ミリ秒、合計: 4313ms73 連続回数 n=2010735、連続値の数: 8、消費時間: 1890ms、合計: 4314ms74 連続回数 n=4652355、連続消費時間の数: 10583ms、合計数: 14897ms75 連続回数 n=4652355、連続値の数: 3、所要時間: 10583ms、合計: 14897ms76 連続回数 n=4652355、連続値の数: 3; 消費時間: 10583ms、合計: 14897ms 連続回数 n=17051709、連続値の数: 86082ms、合計数: 100979ms78 連続回数 n=17051709、連続値の数: 13、所要時間: 86082ms、合計: 100979ms79 連続回数 n=17051709、連続値の数: 13、所要時間: 86082ms、合計: 100979ms80 回連続 n=17051709値の数: 13、所要時間: 86082 ミリ秒、連続 100979 ミリ秒、連続値の数: 13、所要時間: 86082 ミリ秒、連続数 100979 ミリ秒、連続値の数: 13、 : 100979ms83 連続回数 n=17051709、連続値の数: 13、所要時間: 86082ms、合計: 100979ms84 連続回数 n=17051709、連続値の数: 13、所要時間: 86082ms、合計: 100979ms85 回連続 n=17051709値の数: 13; 所要時間: 86083ms、合計: 100980ms 連続 86 回 n=17051709、連続値の数: 13; 所要時間: 86083ms、合計: 100980ms 連続 87 回 n=17051709、所要時間: 86083ms 、 合計 : 100980ms88 回連続 n=17051709、消費時間: 86083ms、合計: 100980ms89 回連続 n=17051709、消費時間: 86083ms、合計数: 100980ms90 回連続 n=20831325、連続する値の数: 15、所要時間: 34772 ミリ秒、連続 135752 ミリ秒、連続値の数: 15、所要時間: 34772 ミリ秒、連続数 135752 ミリ秒、連続値の数: 15、 : 135752ms93 連続回数 n=20831325、連続値の数: 15、消費時間: 34772ms、合計: 135752ms94 連続回数 n=20831325、連続値の数: 34772ms、合計数: 135752ms95 回連続 n=20831325、連続する値の数: 15、所要時間: 34772 ミリ秒、連続 135752 ミリ秒、連続値の数: 15、所要時間: 34772 ミリ秒、連続数 135752 ミリ秒、連続値の数: 15、 : 135752ms98 回連続 n=20831325、消費時間: 34772ms、合計: 135752ms99 回連続 n=20831325、消費時間: 34773ms、合計数: 135753ms100 回連続 n=20831325、連続する値の数: 15、所要時間: 34773 ミリ秒、連続 135753 ミリ秒、連続値の数: 15、所要時間: 34773 ミリ秒、連続数 102 回、連続値の数: 34773 ミリ秒、 : 135753ms103 連続回数 n=20831325、連続値の数: 15、消費時間: 34773ms、合計: 135753ms 連続回数 n=20831325、連続値の数: 34773ms、合計: 135753ms105 回連続 n=47326695、連続値数: 5、消費時間: 319130ms、合計: 452155ms 連続回数 n=47326695、消費時間: 319131ms、合計:連続 452156ms107 回 n=47326695、連続値の数: 5、所要時間: 319131ms、合計: 452156ms108 連続回 n=47326695、所要時間: 319131ms、合計:連続 452156ms109 回 n=47326695、連続値の数: 5、所要時間: 319131ms、合計: 452156ms 連続回数 n=122164749、所要時間: 1395200ms、合計:連続 1847356ms111 回 n=189695661、連続値の数: 6、所要時間: 1705936ms、合計: 3553292ms 連続回数 n=189695661、所要時間: 1705936ms、合計:連続 3553292ms113 回 n=189695661、連続値の数: 6、所要時間: 1705936ms、合計: 3553292ms 連続回数 n=189695661、所要時間: 1705936ms、合計:連続 3553292ms115 回 n=189695661、連続値の数: 6、所要時間: 1705936ms、合計: 3553292ms 連続回数 n=189695661、所要時間: 1705936ms、合計:連続 3553292ms117 回 n=191912785、連続値の数: 7、所要時間: 61964ms、合計: 3615256ms 連続回数 n=191912785、所要時間: 61964ms、合計:連続 3615256ms119 回 n=191912785、連続値の数: 7、消費時間: 61964ms、合計: 3615256ms 連続回数 n=191912785、連続値の数: 7、消費時間: 61964ms、合計: 3615256ms121 連続回数 n=191912785、連続値の数: 7、所要時間: 61964 ミリ秒、合計: 3615256ms122 連続回数 n=191912785、所要時間: 61964 ミリ秒、合計:連続 3615256ms123 回 n=191912785、連続値の数: 7、消費時間: 61964ms、合計: 3615256ms 連続回数 n=387096135、消費時間: 6650201ms、合計数: 10265457ms-----この実行は完了し、次の値は 1000 回を超えました。無駄な時間: 0 ミリ秒、合計: xxxxxx135395 ミリ秒
。 。 。 。 。 。 その後の結果はまだ計算されていません。
コードは次のようになります。
パッケージ com.test.test.zhihe;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set ;/** * 6 つの連続する奇数 a、a+2、a+4、a+6、a+8、a+10 はすべて合成数であり、最小の a */public クラスを見つけますZhishuTest { /** * 数値が合成数であるかどうかを判断します。素数と比較します* @param num * @return */ public static boolean He(int num){ // 平方根 int sq = ((Double)Math. sqrt (num)).intValue(); // 2 ... sq for (int i = 2; i <= sq; i++) { int mo = num % i; if(0 == mo){ return true; } } // return false; } /** * メイン関数* @param args */ public static void main(String[] args) { test(); test() { // 開始時間long startMillis = System.currentTimeMillis(); // 前回の完了時間long preMillis = System.currentTimeMillis(); // 今回の完了時間long curMillis = System.currentTimeMillis(); // int lianxu = 1; int time = 1; for (int x = 1; x <= lianxu; x++) { // ジャンプ渡された場合、次のループに入ります} else { 回 = x; } List<Map<Integer, Integer>> resList = testTimesHe(x, start, false);数字があれば処理する if(null == resList || resList.isEmpty()){ // 見つからなかったら次はない… // ネストが深くて気持ち悪い。 。 。 Break; } int size = resList.size(); // トラバース Iterator<Map<Integer, Integer>> iteratorR = resList.iterator(); while (iteratorR.hasNext()) { Map<Integer, Integer> Map<Integer, Integer>) iteratorR.next(); // if(null != マップ && !map.isEmpty()); // マップのトラバーサルは非常に不快です。 Set<Integer> key= map.keySet(); Iterator<Integer> iteratorK = key.iterator(); if(iteratorK.hasNext()){ Integer key = iteratorK.next( ); // 回数 整数値 = map.get(key) // 最小 n // // この完了時間 curMillis = System.currentTimeMillis() // long allTimeout = curMillis; - startMillis; long curTimeout = curMillis - preMillis; System.out.println(""+key+" 連続回数 n="+value +"、連続値の数: "+size + "; 時間がかかります: " + curTimeout + " ms, total: "+allTimeout+"ms"); // データを処理します。貪欲に処理されたデータは処理されません if(key > 0 && value > 0){ time = key+1; start = value; } } } } // 前回の完了時刻を含めます preMillis = System.currentTimeMillis(); } // // この完了時刻 curMillis = System.currentTimeMillis(); // long allTimeout = curMillis - startMillis; out.println("この実行は完了しました。次の値は 100 回を超えました" + "; 無駄な時間: " + curTimeout + "ms、合計: "+allTimeout+"ms"); } /** * * テスト時間 + 2 は合成数の最小 n です * @param 回の計算時間 * @param start 開始番号 * @paramonlyStart は 1 つの開始値のみを計算します。再帰。外部呼び出しは * @return */ public static List<Map<Integer, Integer>> testTimesHe(int times,int start, booleanonlyStart) { // List<Map<Integer, Integer>> resList= new ArrayList<Map<Integer, Integer>>(); // // 防御的プログラミング if(start < 1){ return resList } if(0 == start % 2 ); { // 偶数は扱わない return resList; } if(times < 1){ time = 1 } // int result = -1; for (int i = start; i < Integer.MAX_VALUE; i+=2) { // // if(onlyStart && i > start){ // start が満たされない場合は、直接 resList を返します。 } for (int j = 0; j <回; j++) { int n = i + 2*j; // if(!He(n)){ // 内部終了} // if(j+1 == 回){ // 結果まで実行します.回result = i; Break を満たします;// 撤退するかどうかは関係ありません、for の最後まで実行します。 } // if(result > 0){ // //System.out.println(" result = "+result ); // Map<Integer, Integer> resMap = new HashMap<Integer, Integer>(); resMap.put(times, result); resList.add(resMap); // 次の回数を試す、再帰; 実際、この再帰アルゴリズムはさらに最適化することができます。 。 。 // startTimes、このパラメータを直接追加します。 。 。 // もう一度、数値から開始します。 result int t = minutes int s = result; is 次のレベルの番号が現在の結果に追加されます。 if(null != nextList && false==nextList.isEmpty()){ resList.addAll(nextList) } // Break; // 外層終了 } } // resList を返す }}
注: まだ改善の余地がありますので、次回修正してください。