标题:这个程序运行了8个小时,求一亿以内的素数和超级素数.
只看楼主
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
得分:0 
楼上的jyd能告诉我你的QQ吗?

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-12-12 20:39
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
得分:0 
如果讨厌“筛法”内存开销过大的话,也可以循下面的思路
1。先建立一个10000以内的素数表
2。将这个素数表作为 array[ ] 的初始化数据
3。建立奇数循环for(i=10001; i<100000000; i=i+2)//大于2的偶数都不是素数
4。用 array[ ] 中的部分乃至全部元素“试除”上文中的 i
如果除尽,就表明 i 不是素数,因而赶快测试下一个奇数即(i+2);
反之,如果无一除尽,就说明“俘获”到一个新素数。。。。。。
2010-12-12 20:42
budong998
Rank: 2
等 级:论坛游民
帖 子:25
专家分:15
注 册:2010-7-18
得分:0 
回复 7楼 yu_hua
谢谢.你这种算法效率是很高.但在TC下数组付不了那么多个的元素.
2010-12-12 21:57
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
得分:0 
#include<stdio.h>
int main( void )
{
    long k,k2=1,kp=2;
    unsigned long p[1230]={2,3},p2=3*3,x=5;
    while(x<100000000)
    {
        if(x==p2)
        {
            k2++;
            p2=p[k2]*p[k2];
            continue;
        }
        for(k=1;k<k2;k++)
        {
            if(x%p[k]==0)goto xadd;
        }
        if(kp<1230)p[kp]=x;
        if(++kp%100000==0)printf("%-10u",x);
        xadd:x=x+2;
    }
    return 0;
}
2010-12-13 20:49
budong998
Rank: 2
等 级:论坛游民
帖 子:25
专家分:15
注 册:2010-7-18
得分:0 
回复 14楼 yu_hua
非常谢谢你的指导!
今天上班没事,我用你12楼给出的算法,重新改了那个程序.结果效率提高了四倍.同时算出一亿以内的素数和超级素数只用了一个半小时.以下是改写的程序,才学不久,写得很烂,不要见笑.
程序代码:
long int big(int a)
{
    long int sn,b=0,c,i,j,m=1,n,x,k[3000]={0,2};
    printf("input a number:\n");
    input: scanf("%ld",&x);   
        sn=sqrt(x);
    if(sn%2==0)sn+=1;
    for(i=3;i<=sn;i+=2)
    {
        j=prime(i);     /*prime 是常规方法求素数的子涵数,把输入的x的平方根以内的素数求出来放在K数组*/
        if(!j)          /*如果返回值为0是素数*/
        {
            m++;k[m]=i;
        }
    }
    for(i=1;i<=m;i++)
    {
        if(a=='4'&&(!(prime_super(k[i]))))          /*以下几个if语句,是看主调涵数传来的什么值,选择求素数还是超级素数,或两种一起求*/
        {
            printf("%ld\t",k[i]);  b++;
        }
        if(a=='5'&&(!(prime_super(k[i]))))
        {
            printf(">");                           /*如果是两个一起求,就在超级素数前标记*/
            b++;
        }
        if(a=='3'||a=='5')
            printf("%ld\t",k[i]); 
    }
    n=m;
    for(i=sn;i<=x;i+=2)               /*用x平方根到X的所有奇数对刚才数组求的的素数取余*/
    {
        for(j=1;j<=m;j++)
        if(i%k[j]==0)break;
        if(j>m)
        {
            if(a=='4'&&(!(prime_super(i))))       /*和上面几个if语句作用一样*/
            {
                printf("%ld\t",i);  b++;
            }
            if(a=='5'&&(!(prime_super(i))))
            {
                printf(">");
                b++;
            }
            n++;
            if(a=='3'||a=='5')
                printf("%ld\t",i);
        }
    }
    if(a=='4'||a=='5')
        printf("\n\tin %ld within super prime numbers sum is %ld ",x,b);   
    if(a=='3'||a=='5')
        printf("\n\tin %ld within prime numbers sum is %ld ",x,n);    
    printf("\nIf necessary validate,press any key.exit press\"q\"\n");
    while(getch()!='q')
        answer('q');       
}
2010-12-13 23:04
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
得分:0 
#include<stdio.h>
#include<time.h>
int main( void )
{
    long k,k2=1,kp=2,pmax,nd=10;
    long x,p[1230]={2,3},p2=3*3;
    for(x=5; x<100000000; x=x+2)
    {
        if(x==p2)
        {
            k2++;
            p2=p[k2]*p[k2];
            continue;
        }
        for(k=1; k<k2; k++)
        {
            if(x%p[k]==0)break;
        }
        if(k>=k2)
        {
            if(kp<1230)p[kp]=x;
            kp++;
            if(kp%1000000==0||kp==nd)printf("//第%ld个素数=%ld\n",kp,x),nd*=10;
            pmax=x;
        }
    }
    printf("//第%ld个素数=%ld\n",kp,pmax);
    printf("//运行耗时%.2f秒\n",clock()/1e3);
    return 0;
}
//第10个素数=29
//第100个素数=541
//第1000个素数=7919
//第10000个素数=104729
//第100000个素数=1299709
//第1000000个素数=15485863
//第2000000个素数=32452843
//第3000000个素数=49979687
//第4000000个素数=67867967
//第5000000个素数=86028121
//第5761455个素数=99999989
//运行耗时82.23秒
//Press any key to continue
2010-12-14 10:00
拂晓晨曦
Rank: 2
等 级:论坛游民
帖 子:87
专家分:44
注 册:2010-10-31
得分:0 
唉。。。
好强大。。。
2010-12-14 11:34
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
得分:10 
// 搜索一亿以内的素数以及“超级素数”
#include<stdio.h>
#include<time.h>
#define SAVE_DISP {super[ns++]=x;printf("//第%ld个超级素数: %ld\n",ns,x);return(1);}

long ns=2,super[99]={2,3};//超级素数

int Super(long x)//假设x已经是素数
{
    if(x<10)
        SAVE_DISP
    else if(x<20)
        return 0;
    else
    {
        for(int i=ns-1;i>=0;i--)
        if(super[i]<=x/10)
        {
            if(super[i]==x/10)
               SAVE_DISP
            else
               return 0;
        }
    }
}

int main( void )
{
    long k,k2=1,kp=2,pmax,nd=10;
    long x,p[1230]={2,3},p2=3*3;
    for(x=5; x<100000000; x=x+2)
    {
        if(x==p2)
        {
            k2++;
            p2=p[k2]*p[k2];
            continue;
        }
        for(k=1; k<k2; k++)
        {
            if(x%p[k]==0)break;
        }
        if(k>=k2)
        {
            if(kp<1230)p[kp]=x;
            kp++;
            if(kp%1000000==0||kp==nd)printf("//第%ld个素数=%ld\n",kp,x),nd*=10;
            pmax=x;
            Super(x);
        }
    }
    printf("//第%ld个素数=%ld\n",kp,pmax);
    printf("//运行耗时%.2f秒\n",clock()/1e3);
    return 0;
}
//第3个超级素数: 5
//第4个超级素数: 7
//第5个超级素数: 23
//第10个素数=29
//第6个超级素数: 29
//第7个超级素数: 31
//第8个超级素数: 37
//第9个超级素数: 53
//第10个超级素数: 59
//第11个超级素数: 71
//第12个超级素数: 73
//第13个超级素数: 79
//第14个超级素数: 233
//第15个超级素数: 239
//第16个超级素数: 293
//第17个超级素数: 311
//第18个超级素数: 313
//第19个超级素数: 317
//第20个超级素数: 373
//第21个超级素数: 379
//第100个素数=541
//第22个超级素数: 593
//第23个超级素数: 599
//第24个超级素数: 719
//第25个超级素数: 733
//第26个超级素数: 739
//第27个超级素数: 797
//第28个超级素数: 2333
//第29个超级素数: 2339
//第30个超级素数: 2393
//第31个超级素数: 2399
//第32个超级素数: 2939
//第33个超级素数: 3119
//第34个超级素数: 3137
//第35个超级素数: 3733
//第36个超级素数: 3739
//第37个超级素数: 3793
//第38个超级素数: 3797
//第39个超级素数: 5939
//第40个超级素数: 7193
//第41个超级素数: 7331
//第42个超级素数: 7333
//第43个超级素数: 7393
//第1000个素数=7919
//第44个超级素数: 23333
//第45个超级素数: 23339
//第46个超级素数: 23399
//第47个超级素数: 23993
//第48个超级素数: 29399
//第49个超级素数: 31193
//第50个超级素数: 31379
//第51个超级素数: 37337
//第52个超级素数: 37339
//第53个超级素数: 37397
//第54个超级素数: 59393
//第55个超级素数: 59399
//第56个超级素数: 71933
//第57个超级素数: 73331
//第58个超级素数: 73939
//第10000个素数=104729
//第59个超级素数: 233993
//第60个超级素数: 239933
//第61个超级素数: 293999
//第62个超级素数: 373379
//第63个超级素数: 373393
//第64个超级素数: 593933
//第65个超级素数: 593993
//第66个超级素数: 719333
//第67个超级素数: 739391
//第68个超级素数: 739393
//第69个超级素数: 739397
//第70个超级素数: 739399
//第100000个素数=1299709
//第71个超级素数: 2339933
//第72个超级素数: 2399333
//第73个超级素数: 2939999
//第74个超级素数: 3733799
//第75个超级素数: 5939333
//第76个超级素数: 7393913
//第77个超级素数: 7393931
//第78个超级素数: 7393933
//第1000000个素数=15485863
//第79个超级素数: 23399339
//第80个超级素数: 29399999
//第2000000个素数=32452843
//第81个超级素数: 37337999
//第3000000个素数=49979687
//第82个超级素数: 59393339
//第4000000个素数=67867967
//第83个超级素数: 73939133
//第5000000个素数=86028121
//第5761455个素数=99999989
//运行耗时83.38秒


[ 本帖最后由 yu_hua 于 2010-12-14 12:55 编辑 ]
2010-12-14 12:43
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
得分:0 
对18楼的代码解释如下
根据“超级素数”的定义,容易看出,
(1)10 以内的素数 2、3、5、7 都是超级素数;
(2)11、13、17、19 不是超级素数,因为 1 不是素数;
(3)大于 20 的素数 x 是超级素数的充要条件:(x/10)是超级素数
根据第(3)款的认识,促使我把搜索到的超级素数存储到 super[ ] 中,
供以后鉴定某素数是不是超级素数用!
2010-12-14 13:08
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
得分:0 
钦佩楼主的求学精神

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2010-12-14 13:41



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




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

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