코드업(codeup)/C

코드업(codeup) 2055 : 두 수의 약수 구하기 C언어

starfish22 2022. 1. 4. 20:52
728x90

▶문제 : 두 수의 약수 구하기 (codeup.kr)

 

두 수의 약수 구하기

두 정수 a, b가 입력된다. (1 <= a <= b <= 1,000,000,000)

codeup.kr

 

▶코드 작성

#include <stdio.h>

int arr[100000];

int main()
{
    int a, b;
    scanf("%d %d", &a, &b);

    int len = 0;//배열 길이
    for (int i = 1; i * i <= b; i++)
    {//i값과 b/i값을 같이 구하기 때문에 i*i<=b 조건으로 최소한의 반복을 하게 함
        if (b % i == 0)//i로 나누어 떨어질 때
        {
            arr[len++] = i;//i는 약수
            arr[len++] = b / i;//b를 i로 나눈 수도 약수
        }

        if (i * i <= a && a % i == 0)//a또한 같은 조건으로( a<=b )
        {
            arr[len++] = i;
            arr[len++] = a / i;
        }
    }

    int min, temp;
    for (int i = 0; i < len - 1; i++)//선택 정렬 오름차순
    {
        min = i;
        for (int j = i + 1; j < len; j++)
        {
            if (arr[min] > arr[j]) min = j;
        }
        if (i != min)
        {
            temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }

    int num = 0;//중복 방지 변수
    for (int i = 0; i < len; i++)
    {
        if (arr[i] != num)//중복되지 않을 때
        {
            printf("%d ", arr[i]);
            num = arr[i];
        }
    }

    return 0;
}

 

▶해석

반복문으로 a와 b의 약수들을 a% i==0와 b% i==0로 찾아준다. 약수 배열에 i값과 a/i, b/i값을 넣어준다. 이때 반복문 조건은 i*i <=b이다.

 예를 들어 a가 16이면 1,2,4,8,16이 약수이다. 여기서 i값이 1,2,4까지만 가도 나머지 약수를 a/i로 찾을 수 있다. i가 4를 넘으면 a/i값은 작아진다. 그럼 i값과 a/i값만 바뀐 채로 다시 약수를 찾는 셈이 되는 것이다. 그러므로 16은 4*4가 마지막으로 찾는 수가 된다. 그런 느낌으로 다른 수 또한 적용된다.

 다른 약수를 모두 구한 후 선택 정렬로 정렬한 다음 변수 num에 출력한 수를 저장하면서 중복하지 않도록 출력해주었다.

728x90