前几天在广州去面试游戏开发,其中一道题是素数的算法优化,无奈之下,实在想不出,失败后回家宿舍查找了一下资料,目前最优的应该是(不太确定)初等数论的筛选法,用空间换时间的一种思想。
筛选法的具体的说明:
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秒。大伙可以试试
打印比计算还要长时间
附上初等数论原书,唉,后悔专业课没学好
版权声明:本文为liyangbinbin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。