임백준씨가 쓴 "임백준의 소프트웨어 산책"이란 책을 최근에 읽었다.
그중에 뒷부분에 '프로그래머 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) = ??
반응형