11653번: 소인수분해
첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.
www.acmicpc.net
문제
정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.
입력
첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.
출력
N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.
예제 입력 1
72
예제 출력 1
2
2
2
3
3
예제 입력 2
3
예제 출력 2
3
예제 입력 3
6
예제 출력 3
2
3
예제 입력 4
2
예제 출력 4
2
예제 입력 5
9991
예제 출력 5
97
103
해결 아이디어
백준 2581번 / 소수 / C++
2581번: 소수 M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다. ww
bonnate.tistory.com
간단한 방식으로 구현하여 O(n)방식과 위 링크에서 다룬 소수를 찾는 알고리즘을 활용하여 O(√n)으로 구현한 것. 두가지로 구현하였다.
O(n)방식
소수를 찾는 방식으로 2부터 n까지 반복하여 n % i == 0이 되는경우 소인수 분해가 가능하다는 점을 이용하여 구현하였다.
채점에서 시간은 32ms가 나왔다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include <iostream>
using namespace std;
int main()
{
int n, i;
cin >> n;
if (n == 1) return 0;
while (true)
{
for (i = 2; i <= n; ++i)
{
if (n % i == 0)
{
cout << i << endl;
if (i == n) return 0;
n /= i;
break;
}
}
}
}
|
cs |
O(√n)방식
제곱근까지 탐색하는 방식을 이용하여 시간 복잡도를 개선하는 방식으로 구현하였다. 채점 시간이 32ms에서 0ms 줄어든 것을 볼 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include <stdio.h>
int main()
{
int n, i;
bool b = 1;
scanf("%d", &n);
if (n == 1) return 0;
while (b)
{
b = 0;
for (i = 2; i * i <= n; ++i)
{
if (n % i == 0)
{
b = 1;
n /= i;
printf("%d\n", i);
break;
}
}
}
printf("%d", n);
}
|
cs |
'algorithms (C++)' 카테고리의 다른 글
[C++] 에라토스테네스의 체 (0) | 2022.07.24 |
---|---|
[C++] 백준 1929번 / 소수 구하기 (0) | 2022.07.24 |
[C++] 백준 2562번 / 최댓값 (0) | 2022.07.24 |
[C++] 백준 2501번 / 약수 구하기 (0) | 2022.07.24 |
[C++] 백준 2747번 / 피보나치 수 (0) | 2022.07.24 |