티스토리 뷰
문제
9020번: 골드바흐의 추측
문제 1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아니다. 골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것이다. 이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다.
www.acmicpc.net
풀이
package main
import (
"fmt"
"bufio"
"os"
"math"
)
func main() {
var t, n int
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
primeNumbers := getPrimeNumbers(10000)
fmt.Fscanln(reader,&t)
for i:=0; i<t; i++ {
fmt.Fscanln(reader, &n)
printGoldBach(n,primeNumbers, writer)
}
}
func getPrimeNumbers(num int) (primeNumbers map[int]bool) {
primeNumbers = make(map[int]bool, num)
for i:=0; i<num; i++ {
primeNumbers[i+1] = true
}
for i:=0; i<num; i++ {
if primeNumbers[i+1] == false {
continue
}
var divisionCount int
for j:=0; j<int(math.Sqrt(float64(i+1))); j++ {
if (i+1) % (j+1) == 0 {
divisionCount++
if divisionCount >1 {
for k:=1; k*(i+1)<=num; k++ {
primeNumbers[k*(i+1)] = false
}
break
}
}
}
}
return primeNumbers
}
func printGoldBach(num int, primeNumbers map[int]bool, writer *bufio.Writer) {
for i:=num/2; i>0; i-- {
if primeNumbers[i] && primeNumbers[num-i] {
fmt.Fprintf(writer, "%d %d\n", i, num-i)
break
}
}
}
728x90
'dev > algorithm' 카테고리의 다른 글
BOJ / 3009번 / 네 번째 점 [Golang] (0) | 2020.05.13 |
---|---|
BOJ / 1085번 / 직사각형에서 탈출 [Golang] (0) | 2020.05.12 |
BOJ / 4948번 / 베르트랑 공준 [Golang] (0) | 2020.05.10 |
BOJ / 1929번 / 소수 구하기 [Golang] (0) | 2020.05.09 |
BOJ / 2581번 / 소수 [Golang] (3) | 2020.05.08 |
댓글