c語言實現位數組實現素數最優算法

前幾天在廣州去面試遊戲開發,其中一道題是素數的算法優化,無奈之下,實在想不出,失敗後回家宿舍查找了一下資料,目前最優的應該是(不太確定)初等數論的篩選法,用空間換時間的一種思想。

篩選法的具體的說明: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秒。大夥可以試試

打印比計算還要長時間

附上初等數論原書,唉,後悔專業課沒學好

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章