알리쿼트 합(Aliquot Sum)이란?
알리쿼트 합은 어떤 수 n의 약수 중에서 자기 자신을 제외한 나머지 약수(진약수)를 모두 더한 값입니다. 예를 들어 숫자가 20이라면, 20의 진약수는 (1, 2, 4, 5, 10)입니다. 따라서 알리쿼트 합은 1+2+4+5+10 = 22가 됩니다.
여기서 흥미로운 사실 하나! 어떤 수의 알리쿼트 합이 그 수 자신과 같다면, 그 수를 완전수(perfect number)라고 부릅니다. 대표적인 예가 바로 6입니다. 6의 진약수는 (1, 2, 3)이며, 알리쿼트 합은 1+2+3 = 6으로 자기 자신과 같습니다.
그럼 아래 알고리즘을 통해 알리쿼트 합을 구하는 방법을 살펴보겠습니다.
알고리즘
getAliquotSum(n)
begin
sum := 0
for i in range 1 to n-1, do
if n is divisible by i, then
sum := sum + i
end if
done
return sum.
endC++ 구현 예제
#include <iostream>
using namespace std;
int getAliquotSum(int n) {
int sum = 0;
for(int i = 1; i < n; i++) {
if(n % i == 0) {
sum += i;
}
}
return sum;
}
int main() {
int n;
cout << "알리쿼트 합을 구할 숫자를 입력하세요: ";
cin >> n;
cout << n << "의 알리쿼트 합은 " << getAliquotSum(n);
}실행 결과
알리쿼트 합을 구할 숫자를 입력하세요: 20 20의 알리쿼트 합은 22
성능 개선 팁
위 코드의 시간 복잡도는 O(n)입니다. n이 매우 큰 수라면, √n까지만 반복하면서 약수를 짝지어 더하는 방식으로 시간 복잡도를 O(√n)까지 줄일 수 있습니다. i가 n의 약수라면 n/i 역시 약수이므로 두 값을 함께 더하면 되는데, 이때 i와 n/i가 같은 경우(예: 완전제곱수)에는 한 번만 더해야 한다는 점에 유의해야 합니다.