Sena's garden

[백준/C언어] 11653번: 소인수분해 본문

백준/C언어

[백준/C언어] 11653번: 소인수분해

paraam02 2024. 8. 26. 23:10

 

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

 

입력: 첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

출력: N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.

 

 

 

 


 

 

 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

	int n;

	scanf("%d", &n);

	while (n > 1) {
		for (int i = 2; i <= n; i++) {
			if (n % i == 0) {
				printf("%d\n", i);
				n /= i;
				break;
			}
		}
	}

	return 0;
}

 

 

 


 

 

이 문제에서 고려해야 하는 것은 같은 수가 반복해서 소인수분해에 사용될 수 있다는 것이다. 우선 소인수 분해할 수 n을 scanf를 통해 입력받는다. n이 1인 경우 아무것도 출력하지 않는다고 했으므로, while 반복문에 이를 사용한다. n>1인 경우 반복문을 실행하도록 조건을 설정한 다음 for문을 이용해 소인수들을 찾는다. for문의 조건의 시작이 i = 2인 것부터 시작한다. 소인수분해할 때 i = 1인 경우는 고려하지 않고 소수를 사용하여 분해하기 때문이다. for문 안에는 if문이 들어가게 되는데 만약 n을 i로 나눈 나머지가 0과 같다면, 그것은 i가 n의 약수이며, 낮은 수부터 올라가 소수인 것을 알 수 있기 때문에 이와 같은 조건을 사용하게 된다. 만약 n % i == 0이라면 그 수를 출력한 후 n의 값을 i로 나눠준 값으로 초기화한다. 그 후 break를 통해 for문의 반복을 멈추게 한다. 이 break를 통해 while문에서 for문이 i가 다시 2부터 시작하기 때문에 계속해서 낮은 수의 소인수부터 구할 수 있게 된다. 이 모든 과정이 반복되고 결국 n이 1보다 작거나 같게 된다면 프로그램을 종료해 문제를 해결한다.