본문 바로가기
백준

백준 17103번[c언어] : 골드바흐 파티션

by 핫동경 2022. 5. 1.
반응형

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

 

17103번: 골드바흐 파티션

첫째 줄에 테스트 케이스의 개수 T (1 ≤ T ≤ 100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 N은 짝수이고, 2 < N ≤ 1,000,000을 만족한다.

www.acmicpc.net


2022.03.21 - [백준] - 백준 9020번 [c언어] : 골드바흐의 추측

 

백준 9020번 [c언어] : 골드바흐의 추측

https://www.acmicpc.net/problem/9020 9020번: 골드바흐의 추측 1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에

dongkyung.tistory.com

9020번 골드바흐의 추측과 매우 비슷한 문제이다.

 

풀이
 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서

ko.wikipedia.org

  • 배열의 0과 1은 소수가아니므로 반복문은 2부터 시작한다
  • 문제에서 순서가 다른 것은 개수로 치지 않는다고 햇으니 우리는 합이되는 모든 경우의 수를 구하고 /2를 해주면 된다.(순서가 다른것들은 제거해야하므로)
  • 10같은 경우 5+5 같은수로 10을 만들 수 있으므로 a-i==i인경우는 경우의수를 하나 더 추가해준다.
#include<stdio.h>

int main() {
	//에라토스테네스의 체
	int arr[1000001] ;
	for (int i = 2; i < 1000001; i++)
		arr[i] = i;   //배열[i]에 자기자신 i를 넣는다

	for (int i = 2; i <= 1000001; i++)
		for (int j = 2; j * i <= 1000001; j++)
			arr[i * j] = 0; 
            //에라토스테네스의 체로 소수가 아닌 숫자들은 0을 넣는다.

	int ntest;
	scanf("%d", &ntest);
	for (int i = 0; i < ntest; i++) {
		int a;
		int answer = 0;
		scanf("%d", &a);
		for (int i = 2; i < a; i++) {
			if (arr[a - i] + arr[i] == a) {
				answer++;
				if (a - i == i) //10에서 5+5인경우
					answer++;
			}
			
		}
		printf("%d\n", answer / 2);
	}
}

 

반응형

댓글