Notice
Recent Posts
Recent Comments
Link
Sena's garden
[백준/C언어] 11653번: 소인수분해 본문
문제
정수 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보다 작거나 같게 된다면 프로그램을 종료해 문제를 해결한다.
'백준 > C언어' 카테고리의 다른 글
| [백준/C언어] 3009번: 네 번째 점 (5) | 2024.08.28 |
|---|---|
| [백준/C언어] 1085번: 직사각형에서 탈출 (0) | 2024.08.27 |
| [백준/C언어] 1978번: 소수 찾기 (0) | 2024.08.25 |
| [백준/C언어] 9506번: 약수들의 합 (0) | 2024.08.24 |
| [백준/C언어] 2501번: 약수 구하기 (0) | 2024.08.23 |