By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
What is the 10001st prime number?
What is the 10001st 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
실행시간(초): 1.203125
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
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
댓글 없음:
댓글 쓰기