| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2103 人关注过本帖
标题:素数统计
只看楼主 加入收藏
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
结帖率:97.78%
收藏
已结贴  问题点数:20 回复次数:16 
素数统计
题目如下:
【问题描述】

    这题意思非常简单,给你一个正整数n,你需要求出有多少个质数小于等于n。

【输入】

    输入文件仅一行,包括一个正整数n。

【输出】

    仅一行,一个整数表示有多少个质数小于等于n。
 
    输出后请注意换行


【输入输出样例】

prime.in
100

prime.out
25


【数据规模】
30%的数据满足:n <= 1000。
50%的数据满足:n <= 200000。
100%的数据满足:1 <= n <= 2000000。

【时间要求】
1s


下面是我写的代码, 感觉效率还能够提高..
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i, j, n;
    int count = 1;            /*直接包括了2这个素数, 能够减少一半循环*/
    int *prime;
    scanf("%d", &n);
    if(n < 1 || n > 2000000){        /*这一段代码在题目中不需要,, 但是作为程序
                                                      的话还是要考虑是否健壮, 不然calloc将会出错*/
        exit(-1);
    }
    if(n < 2){        /*如果是1的话..*/
        count--;
    }
    prime = calloc(sizeof(int), n);
    for(i = 3; i <= n; i += 2){        /*偶数必定不是素数..*/
        if(prime[i] == 1){
            continue;
        }
        count++;
        for(j = 2 * i; j <= n; j += i){
            prime[j] = 1;
        }
    }
    printf("%d\n", count);
    return 0;
}
其实有一种算法肯定是最快的(无与伦比), 就是把1~2000000之间的所有素数作为一个数组保存起来, 然后...(之间省略..) 不过这种算法我感觉不好...

总之我感觉我的代码还有提升的价值, 也想看看各位的代码...
搜索更多相关主题的帖子: 统计 素数 
2010-02-19 23:56
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
prime 申请内存后没赋初值就进行判断(prime[3]==1) ,呵.
2010-02-20 00:16
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
人家用的是 calloc 这个负责填0。
2010-02-20 10:52
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 楼主 zqy110007
我一上来想的就是你那个“无与伦比”的算法~~
我很以前编过程序,做了个 100万 以内的素数表(可惜人要 200万以内的)。至今还留着呢~~
2010-02-20 10:55
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
for(i = 3; i <= n; i += 2){        /*偶数必定不是素数..*/
        if(prime[i] == 1){
            continue;
        }
        count++;
        for(j = 2 * i; j <= n; j += i){
            prime[j] = 1;
        }
    }


显然有提升的价值。

所有数%6余数是0 到5

其中6k+1 跟6k+5才有可能是质数。

只要判断6k+1跟6K+5的数就可以了。

你那算法显然不优。
2010-02-20 12:25
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
回复 5楼 Devil_W
能详细说明一下吗~?
Ps : 俺现在初中文凭...

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2010-02-20 12:39
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
自然数集合是 6k+0 ,6k+1, 6k+2 ,**** 6K+5

除了6k+1跟6k+5没有约数之外都有约数

hint :

6k+2=2(3K+1)

我这么说应该很清楚了。

其实有个素数定理,专门来研究素数分布的。

你可以去check
2010-02-20 12:50
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
回复 7楼 Devil_W
6k + 3 呢~?
6k + 2呢`? (k = 0时)``
  我硬是没写出来

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2010-02-20 16:41
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
6k+2=2(3k+1) 因数为2所以不为质素


6k+3=3(2k+1)因素为3,也不为质素

所以只要判断6k+1跟6K+5
2010-02-20 17:47
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
哦,长见识~~
2010-02-20 18:13
快速回复:素数统计
数据加载中...
 
   



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

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