http://blog.csdn.net/wxyztuv/article/details/7965556
三个函数,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;
- }
- }
- }