| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1502 人关注过本帖
标题:一个素数的问题~
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 9楼 Devil_W
程序代码:

#include <stdio.h>
#define N 1000000
char a[N];

int main(void)
{ 
    int prime[100000] = {0};
    int i,j, nPrime;

    nPrime = 0;

    for (i = 2; i < N; i++)
      a[i]= '1';

    for (i = 2; i < N; i++)
    { 
        if (a[i]) 
             prime[nPrime++] = i;

        for (j = 0; j < nPrime && i*(prime[j]) < N; j++) 
            a[i*prime[j]] = '\0';   
    }
     
    for (i = 2; i < N; i++)
    {
        if (a[i])
            printf("%d ", i);
    }
    printf("\n");
    
    return 0;
}



我就是真命天子,顺我者生,逆我者死!
2009-09-17 12:03
专抓你的错
Rank: 2
等 级:论坛游民
帖 子:113
专家分:22
注 册:2009-5-12
收藏
得分:0 
以下是引用Devil_W在2009-9-17 11:03的发言:

混乱是因为你看不懂。
 
只要看这个数是6n+1还是6n+5
 
6n+2 6n+3 6n+4 6n的不是素数
 
而这6个的集合可以组成自然数集。
 
低效就不知道怎么看出来的。
 
麻烦你写个。
 
我之前在分析大数的素性判断。
 
一 ...
这种结论N年前我就知道了,怎么写这个函数相对高效的办法自己去看我写的电子书

混乱是指你自己的程序逻辑,多做了太明显的无用功

C/C++算法群19472277



第19次算法竞赛http://
2009-09-17 12:07
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 12楼 专抓你的错
更新了吗?  

我就是真命天子,顺我者生,逆我者死!
2009-09-17 12:10
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用专抓你的错在2009-9-17 12:07的发言:

这种结论N年前我就知道了,怎么写这个函数相对高效的办法自己去看我写的电子书

混乱是指你自己的程序逻辑,多做了太明显的无用功



请问你是谁,你的电子书是什么?

难道是传说种的公众人物??
2009-09-17 12:20
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:2 
回复 9楼 Devil_W
求那个数是不是2为底的伪素数,基本上就可以筛掉99%以上的合数。如果求100以内的素数那么直接求伪素数就好了,第一个不是素数的2为底的伪素数出现在300以外。

对于一个数可以连续检验他是不是n个不同的数为底的伪素数,只要n取大于4的话那么如果他不是素数要过检验的概率基本就是0了;

[ 本帖最后由 zhddragon 于 2009-9-17 12:41 编辑 ]

身体是玩命的本钱
2009-09-17 12:34
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
程序代码:
#include <iostream>
using namespace std;

 
const int LIMIT = 1000000;

 
int main()
{
    bool sieve[LIMIT+1];
    int p, j, p2, i;

 
    int nLIMIT = LIMIT -6;
    for (i = 7 ; i <= nLIMIT ; i+=6)
    {
        sieve[i] = true;
        sieve[i+2] = false;
        sieve[i+4] = true;
    }

 
    p = 5;
    while ((j = p*p) <= LIMIT)
    {
        p2 = p << 1;
        while (j <= LIMIT)
        {
            sieve[j] = false;
            j += p2;
        }

 
        do
        {
            p += 2;
        } while (sieve[p] == false);
    }

 

 
    cout << "Prime numbers:\n";
    cout << "2,3,5";

 
    nLIMIT = LIMIT -4;
    for (i = 7 ; i <= nLIMIT ; i += 2)
    {
        if (sieve[i]) cout << "," << i ;
        i+=4;
        if (sieve[i]) cout << "," << i ;
    }

 
    return 0;
}
2009-09-17 13:08
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
其实我不喜欢用辅助数组之类的


如果我要求的是一个大数大过size_t的范围。


又要考虑溢出。
2009-09-17 13:09
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:2 
以下是引用Devil_W在2009-9-17 12:20的发言:

 
 
 
请问你是谁,你的电子书是什么?
 
难道是传说种的公众人物??
这个好像是雨中飞燕妹妹(不知道对不对), 如果你想和她在算法上一较高下的话,你是找对人了.

2009-09-17 13:16
godgoodli
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2009-9-17
收藏
得分:0 
回复 2楼 专抓你的错
就算i=4这种情况系统也不会出错,最后只是跳出这个for语句,去判断下个数是否是素数,完全对结果没有影响;举个法例给你:就算取等号时当i=3时也会出现2>i/2,系统照样执行。
再有,无论取不取等,我都试过结果都是一样的。
2009-09-17 17:55
专抓你的错
Rank: 2
等 级:论坛游民
帖 子:113
专家分:22
注 册:2009-5-12
收藏
得分:0 
以下是引用godgoodli在2009-9-17 17:55的发言:

就算i=4这种情况系统也不会出错,最后只是跳出这个for语句,去判断下个数是否是素数,完全对结果没有影响;举个法例给你:就算取等号时当i=3时也会出现2>i/2,系统照样执行。
再有,无论取不取等,我都试过结果都是一样 ...
你哪里来的下一个数??你在一楼的代码里只有这一行,我根本不知道你完整代码是怎么样
如果你说一样的话,麻烦你交出代码

C/C++算法群19472277



第19次算法竞赛http://
2009-09-17 18:17
快速回复:一个素数的问题~
数据加载中...
 
   



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

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