알고리즘 공부/백준

6588번 골드바흐의 추측 with C++

당장하자 2022. 7. 11. 20:06

문제

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

 

6588번: 골드바흐의 추측

각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰

www.acmicpc.net

 

해결한 방법

1. 전 문제인 소수 구하기에서의 방법으로 소수 리스트를 만듭니다.
2. 소수 리스트에서 하나씩 가져와서 input에서 뺀 값이 소수라면 n = a + b형식으로 출력합니다.
3. 소수 리스트 끝에 도달해도 출력하지 못한다면 "Goldbach's conjecture is wrong."를 출력합니다.
#include <iostream>
#include <cmath>
#define MAX 1000001
using namespace std;

int input_li[100001];
bool prime[MAX];
int prime_li[MAX];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	int input_count = -1;
	int max = 0;
	do{
		input_count++;
		cin >> input_li[input_count];
		if (max < input_li[input_count])
			max = input_li[input_count];
	} while (input_li[input_count]);

	fill_n(prime, MAX, 1);
	prime[0] = false;
	prime[1] = false;

	for (int i = 2; i < sqrt(max); i++) {
		if (prime[i]) {
			for (int j = i * 2; j <= max; j += i){
				prime[j] = false;
			}
		}
	}

	int prime_count = 0;
	for (int i = 0; i <= max; i++){
		if (prime[i]) {
			prime_li[prime_count] = i;
			prime_count++;
		}
	}

	bool is_wrong = true;
	for (int i = 0; i < input_count; i++) {
		for (int j = 0; j < prime_count; j++) {
			if (prime[input_li[i] - prime_li[j]]) {
				cout << input_li[i] << " = " << prime_li[j] << " + " << input_li[i] - prime_li[j] << "\n";
				is_wrong = false;
				break;
			}
		}
		if (is_wrong) {
			cout << "Goldbach's conjecture is wrong." << "\n";
		}
		is_wrong = true;
	}


	return 0;
}