首页 > 学院 > 开发设计 > 正文

百万以内素数快速查找

2019-11-08 01:58:47
字体:
来源:转载
供稿:网友
/**	 * 初级版本	 */	@Test	public void PRime() {		long date = System.currentTimeMillis();		System.out.println(date);		for (int i = 1; i <= 1000000; i++) {			for (int j = 2; j <= i; j++) {				if (i % j == 0) {					if (i / j > 1)						break;					System.out.println(i + "是素数");				}			}		}		date = System.currentTimeMillis() - date;		System.out.println(date);	}
/**	 *<p>	 * 进阶版本	 * </p>	 *<p>	 * 1的处理仍然存在问题	 * </p>	 */	@Test	public void prime1() {		long date = System.currentTimeMillis();		System.out.println(date);		for (int i = 1; i <= 1000000; i++) {			for (int j = 1; j <= i; j++) {				if (j * j <= i) {					if (i % j == 0 && j != 1)						break;					continue;				}				// if (i < 10000)				System.out.println(i + "是素数");				break;			}		}		date = System.currentTimeMillis() - date;		System.out.println(date);		System.out.println(265);	}
/**	 * 百万以内素数最快算法562ms 最终版本	 */	@Test	public void prime2() {		long date = System.currentTimeMillis();		p: for (int i = 1; i <= 1000000; i++) {			for (int j = 2; j * j <= i; j++) {// 1不经过循环直接跳过,避免了1分别作为除数和被除数的特殊情况的判断				// 一个数如果是合数,那么它的所有的因子不超过它的开方				if (i % j == 0)					continue p;// 一旦发现因子,立即跳出对当前数的判断			}			// if(i<10000)			System.out.println(i);		}		date -= System.currentTimeMillis();		System.out.println(-date);	}最后经过查资料又发现了6N+/-法,得到了最后的组合版本
/**	 * 筛选和开方同时使用,组合版本,500ms	 */	@Test	public void prime3() {		long date = System.currentTimeMillis();		p: for (int i = 1; i <= 1000000; i++) {			if (i > 10000 && i % 6 != 1 && i % 6 != 5)// 设置数字筛选,不符合6N法则,直接跳过				continue;			for (int j = 2; j * j <= i; j++) {// 1不经过循环直接跳过,避免了1分别作为除数和被除数的特殊情况的判断				// 一个数如果是合数,那么它的所有的因子不超过它的开方				if (i % j == 0)					continue p;// 一旦发现因子,立即跳出对当前数的判断			}			// if (i < 10000)			System.out.println(i);		}		date -= System.currentTimeMillis();		System.out.println(-date);	}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表