게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C 언어 소스 판별 코드
게시물ID : computer_7333짧은주소 복사하기
작성자 : 엔델
추천 : 0
조회수 : 756회
댓글수 : 3개
등록시간 : 2011/05/31 00:15:39
/* 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;  }  
음.. http://tohtml.com/c/ 이거 좋네요.. 아래 소수 판별 문제가 나옴 김에, 오래전에 작성해본 코드를 올려 봅니다. 신입사원들에게 얼마나 코드를 쥐어 짤 수 있는지 테스트하는 목적이었고, 최대로 쥐어짜면 이정도까지 나온다는걸 보여주기 위해서 저 역시 작성해 본 것입니다. 문제) - 에라토스테네스의 체를 이용해서 1억보다 작은 모든 소수를 구해라. - 모든 소수는 prime.txt 라는 파일에 저장한다. - 소수의 개수를 세서 화면에 출력한다. - clock() 함수를 이용해서 시작과 끝에 시간을 재어, 소요 시간을 출력한다. 사실 이 문제는 수학적인 지식도 필요하기에, 그다지 적당한 문제는 아니긴 했습니다. 어떤 사람은 분단위를 간단히 넘기기도 했고, 가장 잘 짠 사람이 10초정도 나오더군요. 참고로 제가 짠건 1.6초 였습니다. linux 환경에서 gcc 로 컴파일 해서 돌린 코드인데, 아마도 윈도우 환경에서도 문제 없을 꺼라 봅니다. 간만에 다시 보니,, 성능을 위해서 가독성을 포기한 그런 코드가 되어 버렸네요. 회사에서는 이렇게 짜면 안되요.. :) - 엔델 -
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호