Problem Solving/나를 위한 개발

{first 10-digit prime found in cosecutive digits of e}.com

끄적끄적 2008. 7. 11. 11:36
사용자 삽입 이미지

임백준씨가 쓴 "임백준의 소프트웨어 산책"이란 책을 최근에 읽었다.

그중에 뒷부분에 '프로그래머 K씨의 하루'라는 짧막한 소설이 있었는데, 거기에 흥미로운 내용이 있었다.
구글에서 2004년쯤인가에 사진과 같은 광고판을 어느 고속도로에 붙였다고 한다.

{e의 연속된 숫자중에서 10개로 이루어진 첫번째 소수}.com이라는 문구는 유능한 프로그래머를 찾고자 하는 구글의 작은 이벤트였던 것이다.

흥미로워서 실제로 저 수를 구하는 소스를 C로 짜봤다. ㅋㅋ
숫자가 10자리라 int형으로 안되서 double로 처리했음..
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
 
#define TOTAL_ROW 10000
#define EACH_UNIT 10
#define LOOP_CNT 2000
 
int is_prime_sqrt(double n);
 
void main() {
 
        FILE *fp;
 
        char line[TOTAL_ROW];
        char *lineptr;
        char unit[EACH_UNIT];
        int loop_cnt = 0;
 
        double number;
        int is_true;
 
        fp = fopen("e.txt", "r");
 
        if(fp == NULL){
                printf("can't read file\n");
                return 0;
        }
 
        fgets(line, TOTAL_ROW, fp);
        line[TOTAL_ROW] = '\0';
 
        lineptr = line +2;
 
        while(1){
 
                strncpy(unit, lineptr, EACH_UNIT);
 
                number = atof(unit);
                if(is_prime_sqrt(number) == 1)
                        printf("%s\n", unit);
 
                loop_cnt++;
                lineptr++;
                if(loop_cnt > LOOP_CNT)
                        break;
        }
        return 0;
}
 
int is_prime_sqrt(double n)
{
    int i;
    int sqrn;
 
    if(fmod(n, (double)2) == 0){
        return 0;
    }
 
    sqrn = (int)sqrt(n);
    for(i=3; i<=sqrn;i=i+2)
    {
        if(fmod(n, (double)i) == 0)
        {
            return 0;                                                           //소수가 아니다.
        }
    }
    return 1;                                                                   //소수다
}
     
 

실행결과는 다음과 같고, 구글에서 원했던 답은 7427466391.com 이었다. ㅋㅋ
7427466391
7413596629
6059563073
3490763233
2988075319
1573834187
7021540891
5408914993
6480016847
9920695517
1838606261
6062613313
3845830007
0297606737
......

당시에 저 사이트로 들어가면 다음 문제가 있었는데
f(1) = 7182818284
f(2) = 8182845904
f(3) = 8747135266
f(4) = 7427466391
f(5) = ??
음 이문제는 책을 반납한 관계로 시간날때 직접 풀어봐야겠다;
반응형