标题:用位数组计算质数
取消只看楼主
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
 问题点数:0 回复次数:14 
用位数组计算质数
这道题貌似在很多地方都有出现,就我所记得的就有《C和指针》、《算法》。
效果还不错。
1亿以内的质数,不到1分钟得出结果,只是存储结果的文本文档有60.6M,让人完全没有打开的欲望。

额外吐槽一句:《算法》中的代码风格简直糟糕透顶,对比起来《数据结构与算法分析》的代码风格简直业界良心。

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>

int
main( void )
{
     unsigned char *BITArray;
     long maxsize;
     long i, j, k;

     scanf( "%ld", &maxsize );    
     maxsize = maxsize / CHAR_BIT;
     BITArray = ( unsigned char * )malloc( maxsize * sizeof( unsigned char ) );
     assert( NULL != BITArray );

     for( i = 0; maxsize > i; ++i )
         BITArray[ i ] |= 0xAA;
     BITArray[ 0 ] = 0xAC;

     for( i = 3; maxsize * CHAR_BIT > i * i; ++i )
         if( BITArray[ i / CHAR_BIT ] & ( 1 << i % CHAR_BIT ) )
             for( j = 2; maxsize * CHAR_BIT > ( k = j * i ); ++j )
                        BITArray[ k / CHAR_BIT ] &= ~( 1 << ( k % CHAR_BIT ) );

     for( i = 2,j = 0; maxsize * CHAR_BIT > i; ++i )
         if( BITArray[ i / CHAR_BIT ] & ( 1 << i % CHAR_BIT ) )
             /*printf("%10ld%c",i, (j + 1) % 8 ? ' ' : '\n'), */++j;

     printf( "\n%ld\n", j );

     return 0;

}



[此贴子已经被作者于2017-4-7 01:36编辑过]

搜索更多相关主题的帖子: 风格 欲望 color 
2017-04-06 03:18
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 2楼 xzlxzlxzl
想不到问题出在哪儿。

先丢在这儿,等哪天想起了再来弄。

[此贴子已经被作者于2017-4-6 09:30编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-06 07:37
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 4楼 九转星河
是的。程序的其他部分就是筛选法了。

但是程序貌似还有问题,完全想不到在哪儿,先丢在这儿,等哪天有时间了再来慢慢弄。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-06 09:09
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 7楼 吹水佬
筛选法了。速度飞快。

对于位运算符我掌握的很烂。

[此贴子已经被作者于2017-4-6 09:32编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-06 09:31
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 9楼 吹水佬
对啦,帮我把帖子下沉一下了。程序有错,免得祸害别人。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-06 09:56
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 11楼 吹水佬


好吧,莫名其妙的,问题修复了。

[此贴子已经被作者于2017-4-6 10:50编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-06 10:16
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 2楼 xzlxzlxzl
问题修正了。现在得到的值应该是正确的了。

[此贴子已经被作者于2017-4-6 11:08编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-06 10:28
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 15楼 xzlxzlxzl
for( j = i.....)
这句是对的。

问题没有了,现在可以得到正确答案了。
加速方面,再研究研究吧,不着急,慢慢来。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-06 15:17
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 17楼 rjsp
是的,问题就出在这一句。

甚至于原来代码中的那个宏都是我莫名其妙写上去的,早上的时候再来看,甚至不知道自己为什么要写那样一句。

[此贴子已经被作者于2017-4-6 15:22编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-06 15:21
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 19楼 xzlxzlxzl
我是修改了那个宏就得到正确答案了。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-06 15:54



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




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

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