2010년 10월 29일 금요일

Euler Problem 16

문제
2^(15) = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26.
What is the sum of the digits of the number 2^(1000)?

컴퓨터 또는 프로그래밍 언어가 유효 자릿수를 충분히 제공하면 쉽게 계산할 수 있는 문제이다. 그러나 2의 1000제곱은 약 335자리수가 나올 것으로 예상되기 때문에 쉽게 생각할 수 없는 문제이다. (2^n일 경우, 보통 n이 +3마다 자리수가 +1 되므로 약 335자리가 예상됨). 그래서 10자리 숫자로 구분하여 배열에 할당하고, 이를 토대로 계산하는 알고리즘을 구상하였다. 생각보다 매우 빠르게 계산되어졌다. VBA에서도 유효자리수의 한계(15자리)를 이런 방식으로 극복할 수 있다.

Sub Euler16()
    Dim Num(1 To 35) As Double  ' 2^n일 경우, 보통 n이 +3마다 자리수가 +1 되므로 약 334자리가 예상됨. 대략 350자리로 하고 이를 10으로 나눔.
    Dim temp, upNum, i, j, strNum, Sum
    upNum = 0
    Num(35) = 1
    For i = 1 To 1000
        For j = 35 To 1 Step -1
            temp = Num(j) * 2 + upNum
            upNum = Int(temp / 10000000000#)
            Num(j) = temp - (upNum * 10000000000#)
            ' Debug.Print i, j, Num(j), upNum
        Next
    Next
    ' strsum 변수에 배열 Sum의 1번 배열 값을 입력한다.
    strNum = Num(35)
    ' strsum 변수에 나머지 배열 Sum의 값들을 10자리씩 형식을 지정하여 문자열로 연결하여 입력한다.
    For j = 35 To 1 Step -1
        strNum = Format(Num(j), "0000000000") & strNum
    Next
    Sum = 0
    For i = 1 To 350
        Sum = Sum + Mid(strNum, i, 1)
    Next
    ' 왼쪽에서 10개 자리에 있는 숫자들을 출력한다.
    Debug.Print Sum
End Sub

댓글 없음:

댓글 쓰기

2.1 벡터(Vector)

  R의 자료구조 : 벡터, factor, 행렬, 배열, 데이터프레임, 리스트 벡터(Vector)는 동일한 형태(예, 숫자)의 데이터 구성인자가 1개 이상이면서 1차원으로 구성되어 있는 데이터 구조입니다. w <- c(1, 2, 3, 4, ...