1. 程式人生 > >利用素數錶快速尋找 n 以內的所有素數

利用素數錶快速尋找 n 以內的所有素數

三個函式,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;
        }
    }
}


測試結果: