在編程之前,首先我們要了解素數的定義:在大於1的自然數中,除了1和它本身以外不再有其他因數。
因此,我們會最先想到一個方法:設100~200間的這個數是i,用i去分別除以2~(i-1)間的每一個數。
即:
#include<stdio.h> int main() { int i, j; for (i = 100; i <= 200; i++) { for (j = 2; j <= i-1; j++) { if (i%j == 0) break;//如果能整除就跳出該次循環,避免多余運算 } if (j==i)//該條件代表沒有整除。 printf("%d ", i); } printf("\n"); system("pause"); return 0; }
但是運用這種方法進行編程,會使代碼過於繁瑣,系統執行速度較慢,所以我們繼續探究是否能將該代碼進行優化。
這里有兩種優化的方法:
第一種:因為i不可能整除比i/2更大的數,所以我們可以設置第3個變量t,用來存儲i/2的值。
#include<stdio.h> int main() { int i, j,t; for (i = 100; i <= 200; i++) { t = i / 2; for (j = 2; j <= t; j++) { if (i%j == 0) break; } if (j>t) printf("%d ", i); } printf("\n"); system("pause"); return 0; }
第二種:相比於i/2,用t來儲存i的平方根會更加優化這種算法。但這種算法需要引入新的頭函數math.h,和新的函數sqrt()開方函數。
#include<stdio.h> #include<math.h> int main() { int i, j, t; for (i = 100; i <= 200; i++) { t = sqrt(i);//開方函數 for (j = 2; j <= t; j++) { if (i%j == 0) break; } if (j>t) printf("%d ", i); } printf("\n"); system("pause"); return 0; }
到這一步我們只是優化了內循環過程,我們還可以對外循環進行優化。
我們都知道100~200之間的偶數不可能是素數,因此我們可以人為的令i初始化為101,並每次循環時令其+2。
#include<stdio.h> #include<math.h> int main() { int i, j, t; for (i = 101; i <= 200; i+=2) { t = sqrt(i); for (j = 2; j <= t; j++) { if (i%j == 0) break; } if (j>t) printf("%d ", i); } printf("\n"); system("pause"); return 0; }
通過這樣的優化一下子就會使我們的程序計算量減少一半,對提升程序的效率十分有效。
最后附上程序運行后的結果: