문제
1742년, 독일의 아마추어 수학가 크리스티안 골드바흐는 레온하르트 오일러에게 다음과 같은 추측을 제안하는 편지를 보냈다.
4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다.
예를 들어 8은 3 + 5로 나타낼 수 있고, 3과 5는 모두 홀수인 소수이다. 또, 20 = 3 + 17 = 7 + 13, 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23이다.
이 추측은 아직도 해결되지 않은 문제이다.
백만 이하의 모든 짝수에 대해서, 이 추측을 검증하는 프로그램을 작성하시오.
입력
입력은 하나 또는 그 이상의 테스트 케이스로 이루어져 있다. 테스트 케이스의 개수는 100,000개를 넘지 않는다.
각 테스트 케이스는 짝수 정수 n 하나로 이루어져 있다. (6 ≤ n ≤ 1000000)
입력의 마지막 줄에는 0이 하나 주어진다.
출력
각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰 것을 출력한다. 또, 두 홀수 소수의 합으로 n을 나타낼 수 없는 경우에는 "Goldbach's conjecture is wrong."을 출력한다
풀이 코드
while문 내부에서 매번 소수 리스트를 구하던 부분을 while문 외부로 이동
소수 리스트에서 별도로 홀수를 찾는 부분 제거
2는 유일한 짝수 소수이다.
using System;
using System.Linq;
using System.Text;
public partial class Program
{
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
var isPrime = Enumerable.Repeat(true, 1000001).ToArray();
var primeArray = new int[1000001];
GetPrimeNumberList(isPrime, primeArray, 1000000);
while (true)
{
var input = Console.ReadLine();
var number = Int32.Parse(input);
if (number == 0) break;
var results = GetGoldbachConjecture(isPrime, primeArray, number);
if (results == (0, 0))
{
sb.AppendLine("Goldbach's conjecture is wrong.");
}
else
{
sb.AppendLine($"{number} = {results.Item1} + {results.Item2}");
}
}
Console.WriteLine(sb.ToString());
}
public static (int, int) GetGoldbachConjecture(bool[] bools, int[] ints, int n)
{
int a = 0;
int b = 0;
for (int i = 0; i <= n / 2; i++)
{
a = ints[i];
b = n - a;
if (bools[a] && bools[b])
{
return (a, b);
}
}
return (0, 0);
}
public static void GetPrimeNumberList(bool[] bools, int[] ints, int n)
{
int index = 0;
for (int i = 2; i * i <= n; i++)
{
if (bools[i])
{
ints[index++] = i;
for (int j = i * i; j <= n; j += i)
{
bools[j] = false;
}
}
}
}
}
참고 사이트
'프로그래밍 > Algorithm' 카테고리의 다른 글
C# Fisher-Yates Shuffle 알고리즘 (1) | 2024.04.12 |
---|---|
C# [백준 BAEKJOON] 15552번 빠른 A+B (0) | 2024.04.04 |
순열과 조합 관련 코드 (0) | 2024.03.22 |
C# [백준 BAEKJOON] 2981번 검문 (0) | 2024.03.22 |
C# [백준 BAEKJOON] 2501번 약수 구하기 (0) | 2024.03.21 |
댓글