輸出質數(素數)編程題中,判斷當前數是否爲質數時,只驗證要除到根號 原因分析

int main() {
	int n=0; //輸入的n
	cin >> n;
	cout << 2 << endl; // 先輸出2
	for (int i = 3; i < n; i += 2) {//使用循環檢測(<=n)的所有數。優化要點:排除大於2 的偶數,減少不必要的運算
		int j;
		for (j = 3; j < sqrt(i); j++) {// 使用循環。優化要點:只檢測到根號下就可以了。
			if (i%j ==0){
				break;// 不是素數
			}
		}
		if (j * j > i)
			cout << i << endl;
	}
	return 0;
}

 

上面的代碼,是打印到不大於n的所有質數。上面有個sqrt(i),爲什麼麼只需要到根號呢?因爲:

一個數n如果不是素數那麼一定存在若干因子(不少於2個),
假設最小的因子是j,那麼j*j <= n,所以j < 根號n。

也就是說,如果這個數不是素數,你從1——>根號n 的檢測 就已經能判斷他是不是素數了。

舉個例子:12,根號下12大概是3點多, 3*4=12,分界線,4*3=12,可見,在分界線以前就能判斷是質數,分界線後面的不過是交換一下罷了.

而這個分界線就是根號n。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章