프로젝트 오일러 36
10진법과 2진법으로 모두 대칭수인 1,000,000 이하 숫자의 합
어떤 수가 대칭인지 확인하는 방법은 이미 문제 4에서 설명했다. 이진수는 어차피 문자열로 표현해야 하므로 여기서는 다음과 같이 문자열을 인자로 받아 대칭인지 확인하는 함수를 만들어 두는 것이 좋겠다.
내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.
10진법과 2진법으로 모두 대칭수인 1,000,000 이하 숫자의 합
어떤 수가 대칭인지 확인하는 방법은 이미 문제 4에서 설명했다. 이진수는 어차피 문자열로 표현해야 하므로 여기서는 다음과 같이 문자열을 인자로 받아 대칭인지 확인하는 함수를 만들어 두는 것이 좋겠다.
백만 이하인 circular prime 개수 구하기
백만 이하의 소수는 clojure.contrib.lazy-seqs
의 primes
를 이용해 구할 수 있다. digits
를 이용해 숫자의 시퀀스를 만들고 cycle
과 partition
을 이용하면 순환수(circular number)도 쉽게 구할 수 있다.
각 자릿수의 팩토리얼을 더했을 때 자기 자신이 되는 수들의 합은?
먼저 각 자릿수의 팩토리얼을 더한 값을 구하는 함수는 다음과 같이 작성할 수 있다.
이상한 방법으로 약분할 수 있는 분수 찾기
값이 1보다 작고 분모와 분자가 모두 두 자릿수인 분수는 모두 4005개다. 이 정도라면 그냥 루프를 돌려 확인해도 금방 답을 찾을 수 있다. 이상한 방법으로 약분하는 함수는 다음과 같이 작성할 수 있다. n
은 numerator, 즉 분자를 나타내며, d
는 denominator, 즉 분모를 나타낸다.
1~9 팬디지털 곱셈식을 만들 수 있는 모든 수의 합
가 1-9 팬디지털이 되려면 다음과 같은 이유로 가 네 자리 숫자여야 한다.
영국 화폐 액면가를 조합하는 방법의 수
재귀를 이용하면 쉽게 풀 수 있다. 동전의 종류를 숫자 1, 2, ...로 표현하면 문제를 풀 때 도움이 된다. 따라서 다음과 같이 종류 숫자를 인자로 주면 동전 값을 리턴하는 함수를 만들 수 있다.
각 자리 숫자를 5제곱해서 더했을 때 자기 자신이 되는 수들의 합은?
이 문제는 무차별 대입법으로 풀 수 있다. 다만 루프를 무한히 반복하지 않으려면 상한을 알아야 한다. 6자리 수 중 가장 큰 정수는 999,999다. 이 수의 각 자리 숫자를 5제곱해 더하면 354,294가 된다. 즉 6자리 수 중 가장 큰 정수의 각 자릿수를 5제곱해 더해도 354,294보다 큰 수는 못 만든다는 뜻이다.
Emacs를 쓰는 이유가 뭘까? 현대적 에디터와 비교해보면 투박하기 짝이 없는 이 구닥다리 에디터를 여지껏 사용하는 이유가 뭘까? 한참을 생각해 보았지만 명확한 이유를 설명할 수 없다.
이고 인 , 로 만들 수 있는 의 개수
가 대략 100가지, 가 대략 100가지이므로 는 대략 10,000가지 수가 나올 것이다. 여기서 중복을 제거하면 답을 구할 수 있다.
1001×1001 나선모양 행렬에서 대각선 원소의 합은?
대각선 원소에 대한 공식을 구하면 쉽게 문제를 풀 수 있다. 첫 번째 링의 요소는 다음과 같다.
여기서 대각선 요소를 작은 수부터 나열하면 3, 4, 7, 9다.