百万以内素数快速查找

/**
	 * 初级版本
	 */
	@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);
	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值