https://www.acmicpc.net/problem/6588

 

6588번: 골드바흐의 추측

문제 1742년, 독일의 아마추어 수학가 크리스티안 골드바흐는 레온하르트 오일러에게 다음과 같은 추측을 제안하는 편지를 보냈다. 4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다.

www.acmicpc.net

 

 

 

 

문제

 

1742년, 독일의 아마추어 수학가 크리스티안 골드바흐는 레온하르트 오일러에게 다음과 같은 추측을 제안하는 편지를 보냈다.

4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다.

예를 들어 8은 3 + 5로 나타낼 수 있고, 3과 5는 모두 홀수인 소수이다. 또, 20 = 3 + 17 = 7 + 13, 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 이다.

이 추측은 아직도 해결되지 않은 문제이다.

백만 이하의 모든 짝수에 대해서, 이 추측을 검증하는 프로그램을 작성하시오.

 

 

 

 

https://ko.wikipedia.org/wiki/%EA%B3%A8%EB%93%9C%EB%B0%94%ED%9D%90%EC%9D%98_%EC%B6%94%EC%B8%A1

 

골드바흐의 추측 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 골드바흐의 추측(Goldbach's conjecture)은 오래전부터 알려진 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 개의 소수(Prime number)의 합으로 표시할 수 있다는 것�

ko.wikipedia.org

 

 

 

코드

 

c++ 에라토스테네스

#include <iostream>
#include <math.h>
using namespace std;

const int MAX = 1000001;
int prime[MAX]; // 0: 소수,1: 소수x

// 에라토스테네스의 채 
void eratostenes(void){
	for(int i = 2; i * i < MAX; i++) {
		if(!prime[i]) // i가 소수일 경우
			for(int j = i * i; j < MAX; j += i) // i의 배수는 모두 소수가 아님 
				prime[j] = 1;
	}

	prime[1] = 1;
}

int main(void){
	ios_base::sync_with_stdio(false); 
	cin.tie(NULL); 

	int n;
	eratostenes();

	while(1){
		cin>>n;

		if(n == 0) break;

		for(int i = 3; i <= n / 2; i++) {
			if(prime[i] == 0 && prime[n - i] == 0){ 
				cout<<n<<" = "<<i<<" + "<<n - i<<'\n';
				break;
			} else if(i == n / 2)
				cout<<"Goldbach's conjecture is wrong.\n";
		}


	}
}

 

c++ cn

#include <iostream>
#include <math.h>
using namespace std;

bool cn(int n){
	int m = sqrt(double(n));

	if(n == 1) return false;

	for(int i = 2; i <= m; i++) {
		if(n % i == 0) return false;
	}

	return true;
}

int main(void){
	ios_base::sync_with_stdio(false); 
	cin.tie(NULL); 
    
	int n;

	while(1){
		cin>>n;

		if(n == 0) break;

		for(int i = 3; i <= n / 2; i++) {
			if(cn(n - i) && cn(i)){ 
				cout<<n<<" = "<<i<<" + "<<n - i<<'\n';
				break;
			}
			else if(i == n / 2) cout<<"Goldbach's conjecture is wrong.\n";
		}

	}
}

 

python 에라토스테네스

def eratos(n):
  p=2
  while p*p<=n:
    if prime[p]==True:
      for j in range(p*p, n+1, p):
        prime[j]=False
    p=p+1

if __name__ == "__main__":
  prime=[True for _ in range(1000001)]
  eratos(1000000)

  while True:
    n=int(input())
    if n==0:
      break
    else:
      for i in range(2, n):
        if prime[i]==True and prime[n-i]==True:
          print("%d = %d + %d"%(n, i, n-i))
          break
      else:
        print("Goldbach's conjecture is wrong.")
728x90

'알고리즘 > 백준' 카테고리의 다른 글

백준 10872번: 팩토리얼  (0) 2020.05.18
백준 11653번: 소인수분해  (0) 2020.05.18
백준 1929번: 소수 구하기  (0) 2020.05.18
백준 1978번: 소수 찾기  (0) 2020.05.18
백준 11576번: Base Conversion  (0) 2020.05.18