读书人

关于素数?挺难的解决思路

发布时间: 2012-03-22 17:43:57 作者: rapoo

关于素数?挺难的
求素数的一个方法是“筛法”,该方法是:从2开始顺序地检查各个数,如果一个整数没有被划掉,那么它是素数,划去所有它的倍数的数。用这种方法求2到某个n的序列(数组)中的所有素数并输出。要求:仍然用“筛法”,用一个整型数组表示被处理的整数序列,但不是用每个数组元素表示一个整数,而是用数组元素的每个位表示一个整数。当一个整数没有被划掉时,它对应的位应该是1,而当它被划掉时,对应的位是0,这样可以大大地节约存储空间,利用位运算实现这个程序。

[解决办法]
这东西跟星有啥关系....

#include <stdio.h>
#define MAXNN (1024*16)
int main()
{
int i , j , c;
unsigned char flags[MAXNN/2/8+1] ;
for( i = 0; i < sizeof( flags ) ; ++i )
flags[i] = 0xff;
for( i = 1; ; ++i )
{
if( flags[i/8]&(1 < <(i%8)) )
{
c = 2 * i + 1;
j = ( c * c - 1 ) / 2;
if( j > = MAXNN/2 ) break;
for( ; j < MAXNN/2 ; j += c )
flags[j/8] &= ~(1 < <(j%8));
}
}
printf( "%-8d " , 2 );
for( i = 1; i < MAXNN/2 ; ++i )
{
if( flags[i/8]&(1 < <i%8) )
printf( "%-8d " , i * 2 + 1 );
}
printf( "\n\n " );
return 0;
}

读书人网 >C语言

热点推荐