利用素數錶快速尋找 n 以內的所有素數
阿新 • • 發佈:2019-02-01
三個函式,find_prime() 是利用素數表的方法,尋找素數的,find_prime_stupid()是利用另一種傳統方法尋找素數的,test_func()用於測試兩個函式的速度
測試資料分別是 1000,5000,10000,50000,100000,500000,1000000,2000000,5000000 以內的素數。
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <math.h> #include <time.h> #define SIZE 10000000 void find_prime(int n); void find_prime_stupid(int n); int test_func(void); // 建立一個素數表 int prime[SIZE] = {0}; int prime_index = 0; // 素數表索引 int main(int argc,char **argv) { test_func(); return 0; } // 速度測試函式 int test_func(void) { time_t start_time,end_time; int test_data[] = {1000,5000,10000,50000,100000,500000,1000000,2000000,5000000,0}; int i_testdata = 0; printf("\n\nstart testing...\n\n"); // 測試 find_prime() 函式 printf("find_prime():\n"); while(test_data[i_testdata]) { printf("%d\t\t",test_data[i_testdata]); time(&start_time); find_prime(test_data[i_testdata]); time(&end_time); printf("%ds\n",end_time - start_time); ++i_testdata; } // 測試 find_prime_stupid() 函式 printf("\n\n"); i_testdata = 0; printf("find_prime_stupid():\n"); while(test_data[i_testdata]) { printf("%d\t\t",test_data[i_testdata]); time(&start_time); find_prime_stupid(test_data[i_testdata]); time(&end_time); printf("%ds\n",end_time - start_time); ++i_testdata; } return 0; } // 若n是合數,則n必有小於或等於n的正平方根(根號n)的一個素因子 // 遍歷當前素數表,如果當前索引的值不為0, // 並且值不超過了n的正平方根,並且當前值不能整除i, // 則檢查素數表的下一個素數 // 當素數表迴圈檢查停止,檢查停止處的索引值, // 如果值為0,或者值不能整除i, // 則將i加入素數表 void find_prime(int n) { for(int i = 2; i <= n; ++i) { int j = 0; while(prime[j] && i % prime[j] != 0 && prime[j] <= sqrt(i)) { ++j; } if(!prime[j] || i % prime[j] != 0) { prime[prime_index++] = i; // printf("%d ",i); } } } void find_prime_stupid(int n) { int is_prime = 1; for(int i = 2; i <= n; ++i) { for(int j = 2; j <= sqrt(i); ++j) { if(i % j == 0) { is_prime = 0; } } if(is_prime) { // printf("%d ",i); } else { is_prime = 1; } } }
測試結果: