24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2529  |  回复: 14
本帖产生 5 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

[交流] Euler Project Q7. 欧拉工程第七题已有6人参与

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.

What is the 10001st prime number?

列出前6个素数:2,3,5,7,11,13,可看出,第6个素数是13.
第10001个素数是多少?
回复此楼

» 猜你喜欢

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

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

huycwork

金虫 (著名写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+2): 鼓励交流! 2011-05-14 19:57:06
余泽成(程序强帖+1): 2011-05-15 19:10:42
引用回帖:
Originally posted by holmescn at 2011-05-14 13:01:05:
虽然使用了筛选法,但这个matlab程序还是需要7秒多。

[code]
function euler7
    tic;
    n = 10001;
    primes = ones(n,1);
    primes(1:2) = [2 3];
    i = 3;
    m = 5;
    while i <=  ...

分段筛选试试~
整段筛选的话,每次都需要测试相同的素数,就是说,每次都得从2,3开始测试。就算不需要从2开始测试,3,5,7这样的测试是免不了浪费的。
可以观察函数x*y=z可以发现,以x=y=sqrt(z)为分界线,要么xy,也就是说,如果某数存在因数,肯定是一个在sqrt(z)的左边,另一个在右边。这当然不怎么新鲜,问题在于,既然某个数的一个段落之内可能有好几个因数,那就可以一次性全部找出来而不必下次循环时再来从头开始找。
比如说100,sqrt(100)=10,以10为分界线,如果按照整段筛选的策略,那1~100以内的每个数都需要被遍历,每个数都至少要测试sqrt(n)个素数,排在前面的2,3,5这样的素数大约都需要被重复测试100遍,但是如果以50分段,第一遍,一次性找出前面50个素数,重复测试的次数还是50;第二遍的时候性能开始体现,2只需要测试25遍,3只需要测试16遍,5只需要测试10遍,相比100遍来说,还是好一些。
漩涡的中心有一块空地,空空的。
8楼2011-05-14 14:57:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 15 个回答

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★
微尘、梦想(金币+2): 用已有函数,也行,不需要干什么都得自己现编,呵呵…… 2011-05-14 19:55:46
matlab code
CODE:
%% find 10001's prime number
function result = euler7()
tic;
x = primes(200000);
result = x(10001);
toc;
end

结果
CODE:
% Elapsed time is 0.008245 seconds.
% ans =
%       104743

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

微尘、梦想

木虫 (知名作家)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
余泽成(金币+3, 程序强帖+1): 谢谢参与交流! 2011-05-15 19:09:36
来个不作弊的……
CODE:
#include
#include
void main(void)
{
        int n,i=1,j,m,flag;
        for(n=3;1;n+=2)
        {
                flag=0;
                m=sqrt(n);
                for(j=2;j<=m;j++)
                {
                        if(n%j==0)
                                flag++;
                }
                if(flag==0) i++;
                if(i==10001) break;
        }
        printf("%d\n",n);
}

素数的判定方法:用2到sqrt(n)之间的所有整数去除n,如果所有的数都除不尽n,则n为素数,否则n就不是素数。
剩下的一个一个数就行了,一直数到10001……

结果:104743
运行时间:不足1秒

[ Last edited by 微尘、梦想 on 2011-5-14 at 10:36 ]
任风云变幻,我笑对人生!
4楼2011-05-14 10:35:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)


小木虫(金币+0.5):给个红包,谢谢回帖
引用回帖:
Originally posted by 微尘、梦想 at 2011-05-14 10:35:02:
来个不作弊的……
[code]#include <stdio.h>
#include <math.h>
void main(void)
{
        int n,i=1,j,m,flag;
        for(n=3;1;n+=2)
        {
                flag=0;
                m=sqrt(n);
                for(j=2;j<=m;j++)
                {
                        i ...

这个还可以再优化滴~~~
漩涡的中心有一块空地,空空的。
5楼2011-05-14 10:46:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复(可上传附件)
信息提示
请填处理意见