Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 숫자의 모든 약수 곱 구하기


약수의 곱이란?

숫자 n이 주어졌을 때, n의 모든 약수를 찾아 그 약수들을 모두 곱한 결과를 반환하는 것이 이 문제의 목표입니다. 즉, 어떤 수의 '약수들의 곱'을 구하는 것입니다. 여기서 약수란 1을 포함하여 해당 숫자를 나머지 없이 완전히 나눌 수 있는 수를 의미합니다. 예를 들어 6의 약수는 1, 2, 3, 6입니다.

주어진 과제에 따라 숫자의 모든 약수의 곱을 구해야 합니다.

입력 − n = 18

출력 − 5832

설명 − 1 × 2 × 3 × 6 × 9 × 18 = 5832

입력 − n = 9

출력 − 27

설명 − 1 × 3 × 9 = 27

문제 해결 접근 방식

모든 약수를 하나씩 확인하는 대신, √n까지만 반복하면서 약수 쌍을 동시에 처리하면 효율적으로 문제를 해결할 수 있습니다. 접근 방법은 다음과 같습니다.

  • 숫자 num을 입력받습니다.
  • i = 1부터 i × i ≤ num이 될 때까지 반복합니다.
  • num % i == 0이라면(즉, i가 약수라면) 다음을 확인합니다.
    • 만약 num / i == i라면(제곱근인 경우) 같은 약수가 중복되므로 product = (product × i) % MAX로 한 번만 곱합니다.
    • 그렇지 않다면 product를 (product × i) % MAX로 설정하고, 이어서 product를 (product × num / i) % MAX로 설정하여 약수 쌍(i와 num/i)을 모두 곱합니다.
  • 최종 product를 반환합니다.

이 방식은 반복 횟수가 O(√n)으로 줄어들어 큰 수에 대해서도 빠르게 동작합니다.

알고리즘

시작
함수 long long productfactor(int num)
    단계 1 → product를 선언하고 1로 초기화
    단계 2 → i = 1부터 i * i <= num일 때까지 i를 1씩 증가시키며 반복
        만약 num % i == 0이면,
            만약 num / i == i이면,
                product를 (product * i) % MAX로 설정
            아니면,
                product를 (product * i) % MAX로 설정
                product를 (product * num / i) % MAX로 설정
    단계 3 → product 반환
함수 int main()
    단계 1 → n을 9로 선언 및 초기화
    단계 2 → productfactor(n)의 결과 출력
종료

예제 코드

#include <stdio.h>
#define MAX 1000000000
// 약수들의 곱을 구하는 함수
long long productfactor(int num){
    long long product = 1;
    for (int i = 1; i * i <= num; i++){
        if (num % i == 0){
            // 같은 약수(제곱근)는 한 번만 곱한다
            if (num / i == i)
                product = (product * i) % MAX;
            // 그렇지 않으면 두 약수를 모두 곱한다
            else {
                product = (product * i) % MAX;
                product = (product * num / i) % MAX;
            }
        }
    }
    return product;
}
int main(){
    int n = 9;
    printf("%lld\n", productfactor(n));
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −

27