1. 程式人生 > >百萬以內素數快速查詢

百萬以內素數快速查詢

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