前幾天在廣州去面試遊戲開發,其中一道題是素數的算法優化,無奈之下,實在想不出,失敗後回家宿舍查找了一下資料,目前最優的應該是(不太確定)初等數論的篩選法,用空間換時間的一種思想。
篩選法的具體的說明:https://blog.csdn.net/yangxjsun/article/details/80201735
位數組實現的具說明:https://blog.csdn.net/qq_37375427/article/details/79797359
下面貼上我的代碼:
//VS2017 win10 64位debug
//三代i5,計算21億多以內的素數,用時146秒
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define N _CRT_INT_MAX //int 類型的最大表示,大概21億多
#include <time.h>
#include <math.h>
char *init_bin(int n)
{
char *tem = (char *)malloc(n / 8+1);//分配內容,因爲一個字節有8位,每一位表示一個數,多一個字節是怕越界
memset(tem, 0, (n / 8+1)); //清空置0
return tem;
}
int main()
{
char *a = init_bin(N);
long long i, j;
clock_t start, end;
start = clock();
for (i = 2; i < N; i++)
{
if (i % 2)
a[i>>3] |= (1<<(i&0x7));//把2的倍數去掉,變爲0
}
for (i = 3; i < sqrt(N); i++)//把3到根號n質數的倍數去掉
{
if (a[i])
{
for (j = i + i; j < N; j = j + i)
a[j >> 3] &= ~(1 << (j & 0x7));
}
}
end = clock();
printf("time=%f\n", (double)((end - start) / CLK_TCK));//計算時間
for (i = 0; i < N; i++)
{
if (a[i >> 3] & (1 << (i & 0x7)))
printf("%d %c", i, (i % 10 == 0 )? '\n' : ' ');
}
system("pause");
return 0;
}
我的電腦是三代I5,4G win10系統,計算21億多用了146秒。大夥可以試試
打印比計算還要長時間
附上初等數論原書,唉,後悔專業課沒學好