티스토리 뷰

문제
 

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
댓글