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。