inblog logo
|
sxias
    알고리즘

    [알고리즘] 10. 소인수분해

    문정준's avatar
    문정준
    Feb 10, 2025
    [알고리즘] 10. 소인수분해
    Contents
    소인수분해문제 분석코드 작성 - Sampling, Moduling

    소인수분해

    • n = a^x * b^y꼴로 표현하는 프로그램을 작성하시오.
     

    문제 분석

    • 36 = 2^2 * 3^2 = 4 * 9
    • 짝수는 2의 배수 : 4, 6, 8 등의 수로 인수분해 할 필요가 없음 : continue 사용
    • 홀수의 경우 : 9, 25, 49 등의 경우 : 이미 수를 1씩 늘려가며 계속 나눌 것이기 때문에 거듭제곱은 알아서 나누어질 수 있음
    • 나눌 수가 1이 되면 종료
     

    코드 작성 - Sampling, Moduling

    package algo; public class Pf01 { public static void main(String[] args) { // 1. Sampling : 36을 소인수분해하여 나타내시오. // 2. Hard Coding : 특징 찾기 1 - 나머지가 0이면 그 수로 계속 나누어지는지 확인 // 2. Hard Coding : 특징 찾기 2 - 나머지가 0이 아니고 나눌 수가 1이 아니면, 나누는 수 + 1 // 2. Hard Coding : 특징 찾기 3 - 나머지가 0이 아니고 나눌 수가 1이면, 소인수 분해 종료 // 3. Moduling // 3-1. 나눌 수 N int N = 36; // 3-2. 소인수분해 시작할 수 a = 2 int a = 2; // 3-3. 결과 Output - N = a*a*a*.... System.out.print(N + " = "); // 3-4. 조건이 맞을때까지 무한 반복 : 조건반복문 while 사용 while (true) { // 소인수가 2보다 커졌을 때의 짝수 : 비교할 필요 없음 : continue if (a % 2 == 0 && a != 2) continue; // 나머지가 없을 때 : 소인수 분해가 가능할 때 if (N % a == 0) { // N = a : 마지막 소인수 분해 if (N == a) { System.out.println(a); N = N / a; } else { System.out.print(a + " * "); N = N / a; } // N == 1이면 더 이상 소인수 분해가 불가 : break } else if (N == 1) break; // 나머지가 있을 때 : 소인수 분해가 불가능 : a + 1 else a++; } } }
    ✅
    Hard Coding과 Moduling을 통해 알아낸 특징
    1. N % a = 0일 때, 그 수로 계속 나누어지는지 확인 (소인수의 거듭제곱의 경우)
    1. N % a = 0이 아니고 N = 1이 아니면 a + 1
    1. N % a = 0이 아니고 N = 1이면 반복 종료 (소인수분해 종료)
    1. N % a = 0이면서 N = a일 때 : 마지막 소인수 분해 (이후 나눌 수가 1이 되므로 종료)
    Share article
    Contents
    소인수분해문제 분석코드 작성 - Sampling, Moduling

    Sxias ㆍ a32176740@gmail.com

    RSS·Powered by Inblog