2010년 10월 29일 금요일

Euler Problem 7

Euler Problem 7의 내용은 다음과 같다.
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6^(th) prime is 13.
What is the 10001^(st) prime number?

소수를 구하는 문제이다. 만일 100이하의 소수를 모두 구하라 하면 에라토스테네스의 체를 이용하여 알고리즘을 구성하면 보다 좋을 것이나, 이 문제는 10001번째 소수를 구하는 것이라 이를 이용할 수 없다.
따라서 3부터 원하는 답이 나올때까지 홀수만 선정하여 소수인지 검사하는 알고리즘을 구성하였다. 그 결과는 다음과 같다.
Sub euler7()
    Const MaxCount = 10001  '구하고자 하는 소수의 순번(예, 10001번째 소수)
    Dim i, count, PrimeNum
    count = 1   ' 소수 2를 고려하여 카운트를 1로 설정
    i = 3   ' 소수 3부터 시작
    Do
        If IsPrime(i) = True Then
            PrimeNum = i
            count = count + 1
        End If
 i = i + 2   ' 홀수만 검사
    Loop While count < MaxCount
    Debug.Print count, "번째 소수: ", PrimeNum
End Sub

'주어진 수가 소수인지 확인하는 함수
Function IsPrime(Value As Variant) As Boolean
   Dim Limit, i
   Limit = Int(Sqr(Value))
   If Value <= 2 Then
      IsPrime = True
      Exit Function
   End If
   If Mod2(Value, 2) = 0 Then
      IsPrime = False
      Exit Function
   End If
   For i = 3 To Limit Step 2
      If Mod2(Value, i) = 0 Then
         IsPrime = False
         Exit Function
      End If
   Next
   IsPrime = True
End Function

'VBA의 Mod함수는 큰 수에 대해 오버플로가 발생. 따라서 나머지를 구하는 함수 따로 작성
Function Mod2(Num As Variant, Divide As Variant) As Variant
   Dim Mok
   Mok = Int(Num / Divide)
   Mod2 = Num - (Mok * Divide)
End Function
실행시간(초):  1.203125

댓글 없음:

댓글 쓰기

2.1 벡터(Vector)

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