下面是自己基本照抄C和指针上的答案源码,自己就加了一条判断语句。
#include <stdio.h>
#include <time.h>
#define SIZE 1000000
#define TRUE 1
#define FALSE 0
int main()
{
char sieve[ SIZE ];
char *sp; // pointer to access the sieve
int number; // number we're computing
/*
**Set the entire sieve to TRUE
*/
for( sp = sieve; sp < &sieve[ SIZE]; )
*sp++ = TRUE;
/*
** Process each number from 3 to as many as the sieve holds. (Note: the
** loop is terminated from inside.)
*/
int begin = clock( );
for( number = 3; ; number += 2 )
{
sp = &sieve[ 0 ] + ( number - 3 ) / 2;
if( sp >= &sieve[ SIZE ] )
break;
/*
**** 下面一个判断是是自己添加的
*/
/* if( *sp == FALSE )
continue;
*/
while( sp += number, sp < &sieve[ SIZE ] ) // sp += number
*sp = FALSE;
}
printf( "2\n");
for (number = 3, sp = &sieve [ 0 ];
sp < &sieve[ SIZE ]; number += 2, sp++ )
{
if( *sp )
printf( "%d\n", number );
}
int end = clock( );
printf( "程序运行时间 %d \n",end - begin );
return 0;
}
加判断语句之前输出时间为:20 0000
加上判断语句之后输出时间为: 18 0000
下面这些都是没啥营养的东西,自己看的。
用位的数组实现的,C和指针上的答案。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VALUE 1000000
#define MAX_BIT_NUMBER ( ( MAX_VALUE - 3 ) / 2 )
#define SIZE ( MAX_BIT_NUMBER / CHAR_BIT + 1 )
unsigned character_offset( unsigned bit_number );
unsigned bit_offset( unsigned bit_number );
void clear_bit( char bit_array[], unsigned bit_number );
int test_bit( char bit_array[], unsigned bit_number );
unsigned character_offset( unsigned bit_number )
{
return bit_number/CHAR_BIT;
}
unsigned bit_offset( unsigned bit_number )
{
return bit_number%CHAR_BIT;
}
int test_bit( char bit_array[], unsigned bit_number )
{
return (
bit_array[character_offset(bit_number)] &
1<<bit_offset(bit_number)
) != 0;
}
void clear_bit( char bit_array[], unsigned bit_number )
{
//bit_array[character_offset(bit_number)] = ~( (~bit_array[character_offset]) | (1<<bit_offset) );
bit_array[character_offset(bit_number)] &= ~( 1<<bit_offset(bit_number) );
}
int main()
{
char sieve[ SIZE ];
int number;
int bit_number;
char *sp;
for( sp = sieve; sp < &sieve[ SIZE ]; )
*sp++ = 0xff;
for( number = 3; number <= MAX_VALUE; number += 2 )
{
bit_number = ( number - 3 ) / 2;
if( !test_bit( sieve, bit_number ) )
continue;
while( ( bit_number += number ) <= MAX_BIT_NUMBER )
clear_bit( sieve, bit_number );
}
printf( "2\n");
for( bit_number = 0, number = 3; number <= MAX_VALUE;
bit_number += 1, number += 2 )
{
if( test_bit( sieve, bit_number ) )
printf( "%d \n", number);
}
return 0;
}