백준 c++/(1-1)백준 c++ 알고리즘 기초

백준 6588 c++ 골드바흐의 추측

현구구 2022. 7. 5. 12:14


#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);//시간초과 줄여주기 위한 코드
	bool checkprimeNum[1000001];//1000001까지 소수인지 아닌지 체크 소수이면true
	vector<int> primeNum;//판별된 소수를 넣을 vector
	for (int i = 0; i < 1000001; i++)
	{
		checkprimeNum[i] = true;
	}//일단은 true로 넣어줌
	checkprimeNum[1] = false;//1은 소수가 아님
	for (int i = 2; i*i < 1000001; i++)
	{
		for (int j = 2*i; j <= 1000000; j=j+i)//j=i+i의 경우 소수가 아니므로 false처리
		{
			checkprimeNum[j] = false;
		}
	}
	for (int i = 1; i < 1000001; i++)
	{
		if (checkprimeNum[i])//소수인건 primeNum vector에 넣어줌
		{
			primeNum.push_back(i);
		}
	}
	int x;
	while (1)//무한 반복문
	{
		cin >> x;//숫자 입력받기
		if (x == 0)//0 입력받을 시 무한반복문 break
		{
			break;
		}
		else
		{
			if (x % 2 == 1)//홀수의 경우 문자열 출력
			{
				cout << "Goldbach's conjecture is wrong.";
			}
			else
			{
				for (int i = 0; i<=x; i++)
				{
					int n2 = x - primeNum[i];//가장 작은 소수부터 차례로 대입해봤을 때
					if (checkprimeNum[n2])//둘다 소수라면 결과출력
					{
						cout << x << " = " << primeNum[i] << " + " << n2<<"\n";
						break;
					}
				}
			}
		}
	}
}

이 문제의 경우 시간초과가 많이 떴는데

1. 아래 코드와

ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

2.cout출력할 때 endl 보다는 "\n"를 사용하자