백준 17103 c++

magicdrill·2024년 4월 12일
0

백준 문제풀이

목록 보기
293/655

백준 17103 c++

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int input(int lower, int upper);
void input_test_case(vector <int>& vi, int size);
void goldbach(vector <int>& vi);
void make_eratosthenes(int* array, int num);
int find_nums_prime_make_target(int num, int* eratostenes);
void print_result(vector <int> vi);

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

	int T;
	vector <int> test_case;

	T = input(1, 100);
	input_test_case(test_case, T);
	goldbach(test_case);
	print_result(test_case);

	return 0;
}

int input(int lower, int upper)
{
	//cout << "input" << endl;
	int A;

	while (1)
	{
		cin >> A;
		if (A >= lower && A <= upper)
		{
			break;
		}
		else
		{
			;
		}
	}

	return A;
}

void input_test_case(vector <int> &vi, int size)
{
	//cout << "input_test_case" << endl;
	int i, N;

	for (i = 0; i < size; i++)
	{
		N = input(3, 1000000);
		if (N % 2 == 0)
		{
			vi.push_back(N);
		}
		else
		{
			i--;
		}
	}
}

void goldbach(vector <int> &vi)
{
	//cout << "goldbach" << endl;
	vector <int> temp;
	vector <int> prime;
	int* eratostenes;
	int i;

	temp = vi;
	sort(temp.begin(), temp.end());
	eratostenes = new int[temp.back() + 1] { 0 };

	make_eratosthenes(eratostenes, temp.back());
	for (i = 0; i < vi.size(); i++)
	{
		vi[i] = find_nums_prime_make_target(vi[i], eratostenes);
	}

	delete[] eratostenes;

	return;
}

void make_eratosthenes(int *array, int num)
{
	//cout << "make_eratosthenes" << endl;
	int B = num;
	int i, j;
	for (i = 2; i <= B; i++)
	{
		array[i] = i;
	}
	for (i = 2; i * i <= B; i++)
	{
		if (array[i] == i)
		{
			for (j = i * i; j <= B; j = j + i)
			{
				array[j] = 0;
			}
		}
		else
		{
			;
		}
	}

	return;
}

int find_nums_prime_make_target(int num, int* eratostenes)
{
	//cout << "find_nums_prime_make_target" << endl;
	int count = 0;
	int i;

	for (i = 1; i < num; i++)
	{
		if (eratostenes[i] + eratostenes[num - i] == num)
		{
			count++;
			if (eratostenes[i] == eratostenes[num - i])
			{
				count++;
			}
			else
			{
				;
			}
		}
		else
		{
			;
		}
	}

	return count / 2;
}

void print_result(vector <int> vi)
{
	//cout << "print_result" << endl;
	int i;

	for (i = 0; i < vi.size(); i++)
	{
		cout << vi[i] << "\n";
	}

	return;
}

0개의 댓글