BEAKJOON

백준(9020번 골드바흐의 추측)풀이 C++

Shin_jisoo 2021. 1. 13. 17:25
728x90

www.acmicpc.net/problem/9020

 

9020번: 골드바흐의 추측

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아

www.acmicpc.net

1) 주석 없는 VERSION

#include <iostream>
#include <cmath> 
#include <cstdio>

using namespace std;

int find(int n) {
	if (n == 0)return false;

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

	return true;
}

int main() {
	int t;
	cin >> t;

	for (int i = 0;i < t;i++) {
		int n;
		cin >> n;

		int a, b;


		for (int j = n/2;j >=2;j--) {
			
			a = j;
			b = n - a;

			if (find(a) && find(b)) {
				cout << a << " " << b << "\n";
				break;
			}

		}

	}
}

 

2) 주석 있는 VERSION

 

더해줄 두 소수의 차이가 가장 적을 경우는 소수가 서로 같을 때 => n/2 부터 순차적으로 검사

 

항상 a+(n-a)=a 이므로

b를 n-a 로 두고

a와 b 두 수가 소수인지 판별하여 소수인 경우 출력하도록 함

 

#include <iostream>
#include <cmath> 
#include <cstdio>

using namespace std;

// 소수 찾는 함수
int find(int n) {
	if (n == 0)return false;

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

	return true;
}

int main() {
	int t;
	cin >> t;

	for (int i = 0;i < t;i++) {
		int n;
		cin >> n;

		int a, b;

		// 두 수의 차이가 가장 적게 나는 것은 두 소수가 서로 같을 때 이므로
		// n/2 부터 순차적으로 검사
		for (int j = n/2;j >=2;j--) {
			
			// 항상 a + (n - a) = a 이므로 b = n - a로 둠
			a = j;
			b = n - a;

			// a 와 b가 둘 다 소수일 경우 출력
			if (find(a) && find(b)) {
				cout << a << " " << b << "\n";
				break;
			}

		}

	}
}