문제요약:
자연수 N이 주어졌을 때, 소인수 분해 한 소수들을 오름차순으로 나열하라.
제약:
제한시간 1초, 메모리 256MB,
1 <= N <= 10,000,000
예제 1 입력. | 예제 1 출력. |
72 | 2 2 2 3 3 |
예제 2 입력. | 예제 2 출력. |
3 | 3 |
예제 3 입력. | 예제 3 출력. |
6 | 2 3 |
예제 4 입력. | 예제 4 출력. |
9991 | 97 103 |
정답 코드:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#include <iostream>
using namespace std;
// 각 자연수가 소수인지 여부를 저장할 boolean 배열.
bool bIsPrime[10000001];
void _SetPrime(int nSize); // bIsPrime을 초기화 할 함수
void _PrintPrimes(int N); // 소인수 분해 하여 출력할 함수.
int main()
{
int N;
// bIsPrime 초기화. 에라토스테네스의 체.
_SetPrime(10000000);
// 문제에서 주어지는 입력값.
cin >> N;
// 입력값에 따라 소인수 분해 결과를 출력.
_PrintPrimes(N);
return 0;
}
void _SetPrime(int nSize)
{
// Init bIsPrime Values
bIsPrime[1] = false;
for (int i = 2; i <= nSize; i++)
{
bIsPrime[i] = true;
}
// 에라토스테네스의 체. 소수인지 여부를 확인 후 저장.
for (int j = 2; j <= nSize; j++)
{
if (bIsPrime[j] == false)
{
// 대상 (i)가 소수가 아닌 경우 다음으로 넘어감.
continue;
}
// 대상 (i)가 소수인 경우, 해당 소수의 모든 배수를 "소수가 아님" 표시.
for (int k = (2 * j); k <= nSize; k += j)
{
bIsPrime[k] = false;
}
}
}
void _PrintPrimes(int N)
{
// 입력받은 N.
int nTmp = N;
// 2부터 N 까지 loop을 돌면서 확인.
for (int i = 2; i <= N; i++)
{
if (bIsPrime[i] == false)
{
// 소수가 아닌 경우 소인수 분해 X.
continue;
}
// 소수인 경우, nTmp가 1이 될때까지 Loop를 수행.
while (nTmp > 1)
{
// nTmp가 (i)로 나누어 떨어지는 경우
if ((nTmp % i) == 0)
{
// 소수 (i)를 한번 출력 후
cout << i << endl;
// nTmp를 i로 나눈 수로 nTmp를 업데이트.
nTmp /= i;
}
else
{
//나누어 떨어지지 않은 경우 다음 소수 (i)를 구하러 나감.
break;
}
}
}
}
|
cs |
'알고리즘 문제풀이' 카테고리의 다른 글
[알고리즘] 백준 10872번 "팩토리얼" (C/C++) - Don 임베디드 (12) | 2022.03.28 |
---|---|
[알고리즘] 백준 1085번 "직사각형에서 탈출" (C/C++) - Don 임베디드 (8) | 2022.03.25 |
[알고리즘] 백준 2581번 "소수" (C/C++) - Don 임베디드 (8) | 2022.03.22 |
[알고리즘] 백준 1978번 "소수 찾기" (C/C++) - Don 임베디드 (2) | 2022.03.22 |
[알고리즘] 백준 10757번 "큰 수 A+B" (C/C++) - Don 임베디드 (4) | 2022.03.19 |