분류 | 게시판 |
베스트 |
|
유머 |
|
이야기 |
|
이슈 |
|
생활 |
|
취미 |
|
학술 |
|
방송연예 |
|
방송프로그램 |
|
디지털 |
|
스포츠 |
|
야구팀 |
|
게임1 |
|
게임2 |
|
기타 |
|
운영 |
|
임시게시판 |
|
/* vi:set ts=4:*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>
#define MAX_NUM 100000000
unsigned long *pp;
int cnt = 0;
FILE *fp;
int find_prime()
{
unsigned long p,i, tp;
unsigned long sq;
sq = (unsigned long) sqrt(MAX_NUM*1.0);
sq = (sq/30)*30+1;
fprintf(fp,"2\n3\n5\n7\n11\n13\n17\n19\n23\n29\n");
cnt = 10;
#define PRIME_INIT(p) \
do { \
for (i=(p)*(p);i<MAX_NUM;i+=(p)*2) pp[i/64] |= 1 << (i/2)%32; \
} while(0)
PRIME_INIT(3);
PRIME_INIT(5);
PRIME_INIT(7);
PRIME_INIT(11);
PRIME_INIT(13);
PRIME_INIT(17);
PRIME_INIT(19);
PRIME_INIT(23);
PRIME_INIT(29);
for (p=31;p<sq;p+=30)
{
#define PRIME_PRINT_AND_SET(p) \
do { \
if (!(pp[(p)/64] & (1 << ((p)/2)%32))) \
{ for (i=(p)*(p);i<MAX_NUM;i+=(p)*2) pp[i/64] |= 1 << (i/2)%32; \
fprintf(fp, "%d\n", (p)); cnt++; } \
} while(0)
PRIME_PRINT_AND_SET(p);
PRIME_PRINT_AND_SET(p+6);
PRIME_PRINT_AND_SET(p+10);
PRIME_PRINT_AND_SET(p+12);
PRIME_PRINT_AND_SET(p+16);
PRIME_PRINT_AND_SET(p+18);
PRIME_PRINT_AND_SET(p+22);
PRIME_PRINT_AND_SET(p+28);
}
for (p=sq;p<MAX_NUM-30;p+=30)
{
#define PRIME_PRINT(p) \
do { \
if (!(pp[(p)/64] & (1 << ((p)/2)%32))) \
{ fprintf(fp, "%d\n", (p)); cnt++; } \
} while(0)
PRIME_PRINT(p);
PRIME_PRINT(p+6);
PRIME_PRINT(p+10);
PRIME_PRINT(p+12);
PRIME_PRINT(p+16);
PRIME_PRINT(p+18);
PRIME_PRINT(p+22);
PRIME_PRINT(p+28);
}
for (;p<MAX_NUM;p+=2)
{
PRIME_PRINT(p);
}
}
int main(void)
{
int i;
unsigned int st, et;
st = clock();
fp = fopen("prime.txt", "w");
pp = (unsigned long*)malloc(sizeof(unsigned long)*MAX_NUM/64+2);
memset(pp, 0, sizeof(unsigned long)*MAX_NUM/64+2);
find_prime();
fclose(fp);
et = clock();
printf("cnt = %d\n", cnt);
printf("time = %.1f sec\n", (et-st)/(CLOCKS_PER_SEC*1.0));
return 0;
}
죄송합니다. 댓글 작성은 회원만 가능합니다.