24小时热门版块排行榜    

查看: 1640  |  回复: 6
本帖产生 3 个 程序强帖 ,点击这里进行查看

holmescn

金虫 (正式写手)

[交流] Euler 工程 第十题:计算小于2百万的所有质数的和 已有3人参与

The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

Find the sum of all the primes below two million.

小于10的所有质数的和为:2+3+5+7 = 17

那么小于2百万的所有质数的和是多少?


PS:最近的关于质数的问题还真是多啊,哈哈。
PS2:到第10题了,这个题的解出率已经是第一题的一半还不到了。
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
余泽成(金币+1): 谢谢参与讨论! 2011-05-15 19:21:06
只是这些质数问题,侧重点各有不同,第三题要求找出最大质数,第七题要求解出第10001个质数,而这一题根本不要求测试出所有质数,只是求和而已,解法应该也有特殊之处。
漩涡的中心有一块空地,空空的。
2楼2011-05-15 08:44:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
余泽成(金币+3): 谢谢参与交流! 2011-05-15 19:21:33
还是老规矩,先来个偷懒的解法
CODE:
function result = euler10()
tic;
result = sum(primes(2000000));
toc;
end

结果+运行时间
CODE:
% Elapsed time is 0.087248 seconds.
% ans =
%               142913828922

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
3楼2011-05-15 14:56:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
余泽成(金币+3, 程序强帖+1): 谢谢参与交流! 2011-05-15 19:21:47
我先前说的素数算法的实现,偶数部分没有优化,效率看起来还算不错~第七题都没人管了,就发这吧:
CODE:
#include
#include

using namespace std;

enum {
        BUFSZ = 10000,//这个限制产生性能瓶颈,设置越大,性能就越好
        NPRI = 10001    //这个数据就需要估计了,不想估计,就直接vector吧:)
};

bool buf[BUFSZ];
size_t primer[NPRI];

size_t eular7(size_t nprimer = 10001){
        size_t offset = 0, *prip, *cprip;
        int top;//记录素数数
        int falc;//排除的数
        bool *bufp;
        primer[0] = 2;//负责偶数部分
        primer[1] = 3;
        primer[2] = 5;
        top = 3;
        //如果从1开始会把所有的数都false了,offset必须比1要大
        offset += 5;
        while(1){
                for(size_t i = 0; i < BUFSZ; ++i)
                        buf[i] = true;
                falc = 0;
                prip = primer;
                cprip = primer + top;
                bufp = buf;
NEWPRI:   //每当有新的素数就跳回来
                //检查每个已知的素数,这部分可能有bug,测试的时候感觉有点问题
                while(prip - primer < top){
                        size_t mod = offset%(*prip);
                        if(mod == 0){
                                buf[0] = false;
                                ++falc;
                        }
                        for(size_t i = *prip - mod; i < BUFSZ; i+=*prip){
                                if(buf[i])
                                        ++falc;
                                buf[i] = false;
                        }
                        ++prip;//这个指针保证,不会重复遍历素数表
                }
                //添加未知的素数,每次只添加一个
                for(int i = bufp - buf; i < BUFSZ; ++i){
                        if(buf[i]){
                                primer[top++] = offset + i;
                                if(top == nprimer)
                                        goto DONE;
                                bufp = buf+i;//这个指针保证,不会重复检查缓冲数表
                                if(falc + prip - cprip < BUFSZ)
                                        goto NEWPRI;
                        }
                }
                offset += BUFSZ;
        }
DONE:
        return primer[nprimer-1];
}

int main(){
        time_t t1, t2;
        t1 = time(0);
        size_t res = eular7();
        t2 = time(0);
        cout<<"result:"<         cout<<"cost:"<         return 0;
}

如果要适应这题,修改终止条件即可。
漩涡的中心有一块空地,空空的。
4楼2011-05-15 15:45:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

★ ★
余泽成(金币+2, 程序强帖+1): 谢谢参与交流! 2011-05-18 17:05:42
看了huycwork的代码,感觉不太好,用了goto的话,就bad smell了。我写了一个没有goto的版本不过,可能有地方会重叠,造成速度慢。
CODE:
#include
#include
#include

#define PRIMESZ 100002
#define BUFSZ 10000

int nthPrime(int nth) {
    // 总共的质数集
    int primes[PRIMESZ];
    // 每次过滤用的buffer
    int buf[BUFSZ];
    // 已知的质数个数
    int amountOfPrimes;
    // 记录buffer的第一个数
    // 最后一个数以及下一个
    // 是当前质数的倍数的数
    int next, first, last;
    int i, j;

    // 先给两个质数
    primes[0] = 2;
    primes[1] = 3;
    amountOfPrimes = 2;
    last = 3;

    while (amountOfPrimes < nth) {
        // 填充buffer, 不要偶数
        // 这里从最大质数开始,选BUFSZ个数
        // 可能有些数会被重复查找
        // 但可以防止漏掉数
        for(i = 0; i < BUFSZ; i++) {
            buf[i] = primes[amountOfPrimes - 1] + i*2;
        }

        // 保存第一个数和最后一个数,因为可能被修改
        first = buf[0];
        last  = buf[BUFSZ-1];

        for(i = 1; i < amountOfPrimes; i++) {
            // 下一个大于first但是primes[i]的倍数的数
            next = ceil(first * 1.0 / primes[i]);
            // 防止得到偶数
            if (next % 2 == 0) next += 1;

            // 过滤掉primes[i]的倍数
            // 这里我想了很久......
            // 主要是脑子不够用
            for(j = next * primes[i]; j <= last; j += primes[i]*2) {
                buf[(j - first)/2] = 0;
            }
        }

        // 把过滤完了的质数加到primes里
        // 不能加得太多,因为可能有些质数还没有在primes里
        // 这些质数的倍数可能会被加进来
        for(j = 0; j < (BUFSZ < amountOfPrimes?BUFSZ:amountOfPrimes); j++) {
            if(buf[j]) {
                primes[amountOfPrimes++] = buf[j];
            }
            // 够数了就别再加了
            if(amountOfPrimes > PRIMESZ)
                break;
        }
    }

    return primes[nth-1];
}

int main(int argc, char** argv){
    time_t t;
    t = time(0);
    printf("nthPrimes = %d\n", nthPrime(100001));
    printf("%d\n", time(0)-t);
    return 0;
}

5楼2011-05-18 14:35:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
余泽成(金币+2): 鼓励交流! 2011-05-18 17:06:02
引用回帖:
Originally posted by holmescn at 2011-05-18 14:35:44:
看了huycwork的代码,感觉不太好,用了goto的话,就bad smell了。我写了一个没有goto的版本不过,可能有地方会重叠,造成速度慢。

[code]
#include<stdio.h>
#include<math.h>
#include<tim ...

呃,不要goto的版本只需要用return替换掉第一个goto,把while拷贝到第二个goto即可,不过,代码看起来可能更bad诶……
漩涡的中心有一块空地,空空的。
6楼2011-05-18 15:01:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

匿名

用户注销 (小有名气)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
余泽成(金币+3, 程序强帖+1): 鼓励参与交流! 2011-05-24 12:38:22
本帖仅楼主可见
7楼2011-05-24 09:58:17
已阅   回复此楼   编辑   查看我的主页
相关版块跳转 我要订阅楼主 holmescn 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 一志愿武汉理工材料工程专硕调剂 +4 Doleres 2026-03-19 4/200 2026-03-19 15:27 by 丁丁*
[考研] 一志愿北京化工大学0703化学318分,有科研经历,求调剂 +3 一瓶苯甲酸 2026-03-14 3/150 2026-03-19 15:17 by 尽舜尧1
[考研] 求调剂,一志愿:南京航空航天大学大学 ,080500材料科学与工程学硕,总分289分 +3 @taotao 2026-03-19 3/150 2026-03-19 14:07 by peike
[考研] 一志愿福大288有机化学,求调剂 +3 小木虫200408204 2026-03-18 3/150 2026-03-19 13:31 by houyaoxu
[考研] 267一志愿南京工业大学0817化工求调剂 +10 SUICHILD 2026-03-12 10/500 2026-03-19 09:51 by Delta2012
[考研] 一志愿中国海洋大学,生物学,301分,求调剂 +4 1孙悟空 2026-03-17 4/200 2026-03-18 17:59 by fivewind
[考研] 295求调剂 +3 一志愿京区211 2026-03-18 5/250 2026-03-18 17:03 by zhaoqian0518
[考研] 311求调剂 +6 26研0 2026-03-15 6/300 2026-03-18 14:43 by haxia
[考研] 297求调剂 +8 戏精丹丹丹 2026-03-17 8/400 2026-03-18 14:30 by laoshidan
[考研] 0854,计算机类招收调剂 +3 胡辣汤放糖 2026-03-15 6/300 2026-03-18 12:09 by 上岸上岸……..
[考研] 296求调剂 +5 大口吃饭 身体健 2026-03-13 5/250 2026-03-17 21:05 by 不惑可乐
[考研] 26考研求调剂 +6 丶宏Sir 2026-03-13 6/300 2026-03-17 16:13 by 醉在风里
[考研] 材料与化工专硕调剂 +5 heming3743 2026-03-16 5/250 2026-03-17 14:03 by 勇敢太监王公公
[考研] 机械专硕325,寻找调剂院校 +3 y9999 2026-03-15 5/250 2026-03-16 19:58 by y9999
[考研] 070300化学学硕求调剂 +6 太想进步了0608 2026-03-16 6/300 2026-03-16 16:13 by kykm678
[考研] 289求调剂 +4 这么名字咋样 2026-03-14 6/300 2026-03-14 18:58 by userper
[基金申请] 现在如何回避去年的某一个专家,不知道名字 +3 zk200107 2026-03-12 6/300 2026-03-14 17:13 by zk200107
[考研] [0860]321分求调剂,ab区皆可 +4 宝贵热 2026-03-13 4/200 2026-03-13 22:01 by 星空星月
[考研] 295求调剂 +3 小匕仔汁 2026-03-12 3/150 2026-03-13 15:17 by vgtyfty
[考研] 289求调剂 +3 李政莹 2026-03-12 3/150 2026-03-13 11:02 by 求调剂zz
信息提示
请填处理意见