学习了上面那个大牛的博客里的筛选法 写的一个求质数和的算法 真的好快 贴出来 大家看下
看来算法才是王道啊
程序代码:
/*
*筛选法求大范围内所有质数和
*
*思路:1. 筛选法 参考:<span style="color: #008000; text-decoration: underline;">http://blog.[/color]
* 2. 用bit位标记大范围内所有自然数,0 不是质数 1 是质数
*
*流程:1. (从质数2开始)将该质数所有的倍数所在位全部清零
* 2. 将该质数值加进sum
* 3. 从该质数所在位向后查找第一个未置零的位(即下一个质数)
* 若其值在最问题所在范围内 返回1
* 否则 退出,sum即所求
*
*子方法: 1. BitSearch 从给定位置向后搜索第一个为1的位,返回位置的序号
* 2. BitClear 对指定位清零
*/
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef unsigned long LCNT;
typedef unsigned long CELL;
#define DAT_SIZE 2000000
#define CELL_SIZE (sizeof(CELL)*8)
#define MEM_SIZE (DAT_SIZE/8 + 1)
LCNT BitSearch(CELL bitSet[], LCNT startPos);
void BitClear(CELL bitSet[], LCNT bitPos);
int main()
{
LCNT i, primSum = 0, primCnt = 2;
CELL *primSet = (CELL*)malloc(MEM_SIZE);
if(primSet == NULL){
printf("内存不足\n");
return 1;
}
else{
memset(primSet, 0xFF, MEM_SIZE);
primSet[0] ^= 3; //质数从2开始,自然数[0,1]所在位清零
}
while(primCnt < DAT_SIZE){
for(i=2; primCnt*i < DAT_SIZE; i++)
BitClear(primSet, primCnt*i);
primSum += primCnt;
primCnt = BitSearch(primSet, primCnt+1);
}
printf("The Sum is %ld\n", primSum);
return 0;
}
LCNT BitSearch(CELL bitSet[], LCNT startPos)
{
LCNT arrPos = startPos/CELL_SIZE, bitPos = startPos%CELL_SIZE;
while(arrPos < MEM_SIZE){
if(bitSet[arrPos] != 0){
for(bitPos; bitPos < CELL_SIZE; bitPos++)
if((bitSet[arrPos] >> bitPos)%2 == 1)
goto OUT;
bitPos = 0;
}
arrPos++;
}
OUT:
return arrPos*CELL_SIZE + bitPos;
}
void BitClear(CELL bitSet[], LCNT bitPos)
{
bitSet[bitPos/CELL_SIZE] &= ~((LCNT)1 << bitPos%CELL_SIZE);
}