Project Euler - Problem48 └ Project Euler

Problem 48


18 July 2003

The series, 11 + 22+ 33 + ... + 1010 = 10405071317.
Find the last ten digits of the series, 11 + 22 + 33 + ... + 10001000.


문제 48.

1의 1승 ~ 1000의 1000승 까지의 각 숫자의 총 합에서 마지막 10자리의 숫자를 구하라.

erlang code

%% Problem 48
%% 18 July 2003
%%
%% The series, 1^(1) + 2^(2) + 3^(3) + ... + 10^(10) = 10405071317.
%%
%% Find the last ten digits of the series, 1^(1) + 2^(2) + 3^(3) + ... + 1000^(1000).

-module( problem48 ).
-export( [calc/0] ).

% 값 계산하는 함수
calc() ->
      
% 1^1 ~ 1000^1000 까지의 수열을 구한다
        Li = [ square( X, X ) || X <- lists:seq( 1, 1000 ) ],
        Sum = lists:sum( Li ),

        % 파일에 쓴다. 문제랑은 별 상관 없지만..
        write_to_file( "result.txt", Sum ),

        % 숫자를 문자열로 바꿔주는 라이브러리 함수.
        StrSum = erlang:integer_to_list( Sum ),

        % 끝 10자리를 잘라낸다.
        cut_last( StrSum, 10 ).
        

% N의 M승
square( N, 1 ) ->
        N;
square( N, M ) ->
        N * square( N, M-1 ).


% 파일에 쓰기
write_to_file( FileName, N ) ->
        {ok, SDevice} = file:open( FileName, write ),
        io:write( SDevice, N ),
        file:close( SDevice ).

% 문자열(==리스트)의 마지막 Len자리의 항목을 끊어낸다.
cut_last( List, Len ) ->
        Rv = lists:reverse( List ),
        Sub = lists:sublist( Rv, 1, Len ),
        lists:reverse( Sub ).


역시나 리스트의 합계를 구하는 함수는 라이브러리에 있었어....;;

그나저나 erlang의 우월한 정수계산능력이나 찬양합시다.

11 + 22 + 33 + ... + 10001000
를 계산한 결과.

result.txt

계산후 10자리 끊기 전에 파일로 뽑아낸것.

덧글

  • daewonyoon 2009/08/29 01:02 # 답글

    square 란 함수명은 제곱이란 뜻이니까, (세제곱은 cube) 일반적인 거듭제곱의 이름으로는 혼동될 수 있네요. 저라면 pow 쓰겠습니다. python이는 n**n 하면 알아서 계산해 줍니다. (우월한 파이썬!)
  • Rei 2009/08/29 02:07 #

    아, 그렇지 pow가 있었군요;;; 전혀 생각 안하고 짜서..ㅠㅠ
댓글 입력 영역


통계 위젯 (블랙)

01
9
53796

이 이글루를 링크한 사람 (블랙)

11