Java实现的连续奇数(n+2*x)是合数的算法题暴力算法(2)
代码如下所示: package 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;/** * 连续
代码如下所示:
package 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 class 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(); } public static void test() { // 开始时间 long startMillis = System.currentTimeMillis(); // 上次完成时间 long preMillis = System.currentTimeMillis(); // 本次完成时间 long curMillis = System.currentTimeMillis(); // int lianxu = 1000; int start = 1; int times = 1; for (int x = 1; x <= lianxu; x++) { if(times > x){ continue;// 跳过,进入下一次循环 } else { times = 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 = (Map<Integer, Integer>) iteratorR.next(); // if(null != map && !map.isEmpty()){ // Map遍历太恶心了.烂Java Set<Integer> keys= map.keySet(); Iterator<Integer> iteratorK = keys.iterator(); if(iteratorK.hasNext()){ Integer key = iteratorK.next(); // 次数 Integer value = map.get(key); // 最小n // // 本次完成时间 curMillis = System.currentTimeMillis(); // long allTimeout = curMillis - startMillis; long curTimeout = curMillis - preMillis; System.out.println(""+key+"次连续n="+value +",连续值个数: "+size + ";耗时: " + curTimeout + "ms,总计: "+allTimeout+"ms"); // 处理数据,贪婪处理过的就不处理了 if(key > 0 && value > 0){ times = key+1; start = value; } } } } // 计入上次完成时间 preMillis = System.currentTimeMillis(); } // // 本次完成时间 curMillis = System.currentTimeMillis(); // long allTimeout = curMillis - startMillis; long curTimeout = curMillis - preMillis; System.out.println("本次已经跑完了,下一个值超出了100次 " + ";无用耗时: " + curTimeout + "ms,总计: "+allTimeout+"ms"); } /** * * 测试 times 次的+2都是合数的最小n * @param times 计算次数 * @param start 起始数字 * @param onlyStart 只计算单个start值.用于递归.外部调用应该传入 * @return */ public static List<Map<Integer, Integer>> testTimesHe(int times,int start, boolean onlyStart) { // List<Map<Integer, Integer>> resList= new ArrayList<Map<Integer, Integer>>(); // // 防御式编程 if(start < 1){ return resList; } if(0 == start % 2){ // 不处理偶数 return resList; } if(times < 1){ times = 1; } // int result = -1; // for (int i = start; i < Integer.MAX_VALUE; i+=2) { // // 避免一直计算不返回 if(onlyStart && i > start){ // start 不满足,就直接 return resList; } for (int j = 0; j < times; j++) { int n = i + 2*j; // if(!He(n)){ break;// 内层退出 } // if(j+1 == times){ // 跑到结果了. times 次都满足 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, 直接加这个参数。。。贪婪递归? // 多1次,从result这个数开始 int t = times +1; int s = result; List<Map<Integer, Integer>> nextList = testTimesHe(t, s, true); // 如果有下一层的数字,则加入到当前结果 if(null != nextList && false==nextList.isEmpty()){ resList.addAll(nextList); } // break;// 外层退出 } } // return resList; } }
说明: 还有改进空间,欢迎下次修正
收藏文章
精彩图集
精彩文章