标题:两百万以下所有质数的和
只看楼主
tompobing
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:260
专家分:809
注 册:2012-12-9
结帖率:78.13%
已结贴  问题点数:20 回复次数:12 
两百万以下所有质数的和
两百万以下所有质数的和
传统的算法运行太慢了,好半天才算出来,求效率的算法

#include <stdio.h>
#include <math.h>
int main()
{
    int i,j,sum=0;
    int flag=1;
    for(i=3;i<20000000;i++)
    {
        flag=1;
        for(j=2;j<=sqrt(i);j++)
        {
            if(i%j==0)
            {
                flag=0;
                break;
            }
        }
        if(flag)
            sum+=i;
    }
    printf("%d\n",sum);
    return 0;
}
搜索更多相关主题的帖子: 传统 include 
2013-03-26 20:51
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
得分:0 
参考: http://blog.

人生是一场错过 愿你别蹉跎
2013-03-26 21:48
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
得分:20 
不好意思 错了
应该是这个页面:
http://blog.

人生是一场错过 愿你别蹉跎
2013-03-26 21:50
czzdcn123
Rank: 7Rank: 7Rank: 7
来 自:江西
等 级:黑侠
威 望:3
帖 子:258
专家分:510
注 册:2013-3-7
得分:0 
来学习
2013-03-26 22:00
烈阳雨
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2013-3-19
得分:0 
好大的取值范围。。
2013-03-26 22:34
我比烟花寂寞
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-3-26
得分:0 
基本看不懂 完了
2013-03-26 22:39
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
得分:0 
学习了上面那个大牛的博客里的筛选法 写的一个求质数和的算法 真的好快 贴出来 大家看下
看来算法才是王道啊
程序代码:
/*

 *筛选法求大范围内所有质数和 

 * 

 *思路: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);
}


人生是一场错过 愿你别蹉跎
2013-03-27 02:17
zhangfudong
Rank: 4
等 级:业余侠客
帖 子:119
专家分:212
注 册:2012-12-12
得分:0 
接分
2013-03-27 08:08
旺旺佳佳
Rank: 2
等 级:论坛游民
帖 子:36
专家分:44
注 册:2013-3-11
得分:0 
这么多啊!!!
2013-03-27 08:10
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
得分:0 
不好意思 main函数最后忘了释放内存了 加一句 free(primSet); 就没事了
不过在main函数中 也没有影响 程序结束时会自动释放的 要是在其他函数局部域 就内存泄露了
疏忽啊

人生是一场错过 愿你别蹉跎
2013-03-27 09:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-402012-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.429990 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved