标题:用位数组计算质数
只看楼主
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用renkejun1942在2017-4-6 09:56:32的发言:

对啦,帮我把帖子下沉一下了。程序有错,免得祸害别人。

错不怕,改了就是。
编程不停,改错继续。
2017-04-06 10:14
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
peter张
Rank: 2
等 级:论坛游民
威 望:1
帖 子:56
专家分:98
注 册:2017-3-7
得分:0 
不懂,占楼学习。
2017-04-06 13:21
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
回复 12楼 renkejun1942
不会吧,自己码出来的应该很容易找到问题的。
错误在筛去质数倍数的算法上,应该是从2倍开始,你是从i值开始的,修改如下即可(红色部分为修改部分):
     for( i = 2; maxsize * CHAR_BIT > i; ++i )
         if( BITArray[ i / CHAR_BIT ] & ( 1 << i % CHAR_BIT ) )
             for( j = 2; maxsize * CHAR_BIT > j * i; ++j )  //原来为j=i

在你的代码基础上做些修改可以略微帮你提提速,大概快600毫秒(不同机器结果不同),如下:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#define BIT ( sizeof( unsigned char ) * 8 )

int
main( void )
{
    unsigned char *BitArray;
    long maxsize;
    long i, j,t;

    //scanf( "%ld", &maxsize );
    maxsize=100000000;
    t=clock();
    maxsize = maxsize / BIT;
    BitArray = ( unsigned char * )malloc( maxsize * sizeof( unsigned char ) );
    assert( NULL != BitArray );

    for( i = 0; maxsize > i; ++i )
        BitArray[ i ] |= 0xaa;
    BitArray[0]=172;    //0xFF改成0xAA避开偶数部分,偶数不可能是质数
    for( i = 3; maxsize * BIT >= i*i; i+=2 )   //质数从3开始,每次+2,则避开了偶数的检测,另只需要判断i*i<=maxsize * BIT,即可筛掉所有合数
        if( BitArray[ i / BIT ] & ( 1 << i % BIT ) )
            for( j = i+i; maxsize * BIT > j ; j+=i )
                    BitArray[ j  / BIT ] &= ~(1 << ( j  % BIT ));

    for( i = 3,j = 1; maxsize * BIT > i; i+=2 )
        if( BitArray[ i / BIT ] & ( 1 << i % BIT ) )++j;;
            //printf("%10ld%c",i, (j + 1) % 8 ? ' ' : '\n'), ++j;
    printf("time:%d   sum:%d\n",clock()-t,j);

    return 0;

}


我的位筛代码之所以比你的代码还快些,是因为我在位运算上也采取了查表。
2017-04-06 14:58
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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
路过,说说 #define BIT ( sizeof( unsigned char ) * 8 ) 这一句
根据C/C++标准,sizeof获得的就是所占char数,即“sizeof(char), sizeof(signed char), and sizeof(unsigned char) always return 1.”
而一个char有几个bits则是不固定的,C/C++标准提供了一个宏 CHAR_BIT 来表示它。

2017-04-06 15:20
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
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
回复 16楼 renkejun1942
r版主所说的情况,的确应该考虑在内,不过在32位系统下应该不会出问题。事实上,我只是将你的代码只修改j=i为j=2即得到正确答案了。

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

2017-04-06 15:49
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.480106 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved