https://bbty97.manage/newpost/?type=post&returnURL=%2Fmanage%2Fposts%2F
이야기
나를 표현하는 블로그를 만드세요.
www.history.com
배수, 약수, 소수에 대해 이렇게 많은 글을 올릴 줄은 몰랐는데 다들 아시겠지만 종에 따라 시차가 많이 다른 것을 보면 여러 각도에서 바라보는 것이 얼마나 중요한지 다시 한 번 깨닫게 됩니다.
알고리즘이 구현됩니다.
< Ansatz 1 - Fehler >
이전 소수 문제에서 사용한 알고리즘 √n을 다시 사용했습니다.
예를 들어 6은 2부터 모든 숫자를 세어 3 + 3 = 6을 찾습니다.
순서쌍 (2, 3)과 (3, 2)는 어쨌든 동일하게 취급되므로 6의 절반인 3까지만 세면 됩니다.
가지수가 급격하게 줄었으니 아마도…? 나는 그것을 할 의도로 시도했지만 시간이 초과되었습니다.
시간 복잡도는 O(n^4)이므로 자연스러워 보입니다.
< Ansatz 2 - Erfolg >
이번에는 방법을 몰라서 구글에 도움을 요청했습니다.
“에라토스테네스의 체”라는 기술을 사용했기 때문에 살펴보고 먼저 배열을 할당하는 것부터 시작했습니다.
이 방법은 그리 오래 걸리지 않은 것 같습니다.
방법은 간단했습니다.
입력 값의 범위와 마찬가지로 배열이 먼저 생성되고 초기화되며 2부터 시작하여 해당 숫자의 배수는 배열의 값을 0으로 만들고 끝에 소수만 남깁니다.
(알고리즘) 에라토스테네스의 체
에라토스테네스의 체란? 소수를 결정하는 알고리즘입니다.
큰 집합에서 소수를 찾는 빠르고 정확한 방법입니다.
단일 숫자가 소수인지 확인 숫자가 소수인지 확인할 때 특정 숫자
velog.io
에라토스테네스의 체 구현은 동일하지만 골드바흐 파티션 카운팅 알고리즘은 약간 다르게 구현됩니다.
위 블로그에서 같은 번호가 나오면 e.g. 5 + 5 = 10, 하나 더 세고 마지막으로 /2, 위에 쓴 것처럼 처음에는 n/2까지만 세었습니다.
아래는 코드입니다.
#포함하다
#포함하다
#포함하다
#포함하다
#define MAX 1000000
네임스페이스 std 포함;
int arr(최대 + 1);
정수 메인()
{
ios_base::sync_with_stdio(거짓);
친 타이(ZERO);
cout.tie(NULL);
for (int i = 2; i <= MAX; i++) {
arr(i) = I;
}
for (int i = 2; i <= sqrt(MAX); i++) {
if (arr(i) == 0)
계속해;
for (int j = i * i; j <= MAX; j += i)
anr(j) = 0;
}
정수 T;
cin >> T;
정수 n;
for (int i = 0; i < T; i++) {
정수 카운터 = 0;
cin >> n;
for (int j = 2; j <= n/2; j++) {
if (arr(j) + arr(n – j) == n)
카운트++;
}
cout << 개수 << endl;
}
0을 반환합니다.
}