Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- SOH
- linux
- AABB
- 벡터
- Expanding Polytope Algorithm
- 우분투
- 수학
- Unity
- 내적
- 보로노이다이어그램
- 외적
- C
- ubuntu
- dp
- Vector
- C++
- c#
- 알고리즘
- GJK
- 문제풀이
- 백준
- PS
- uclidean algorithm
- Doubly Connected Edge List
- 다이나믹 프로그래밍
- 리눅스
- 분할축 이론
- Graham Scan
- 충돌 알고리즘
- 유니티
Archives
- Today
- Total
마이 플밍 블로그
[알고리즘] 약수 구하기 알고리즘 본문
보통 가장 간단한 모든 약수를 구하는 알고리즘하면 1부터 N까지 반복문을 돌려 N % i == 0 일경우 약수로 하는 알고리즘을 생각할 것이다. 이경우 시간 복잡도는 O(N)이 되는데 O(√N) 으로 줄일 수있다.
방법은 간단하다. N의 약수들 중 √N 이하의 것들을 구하고 그 것들을 N에 나누면 다른 약수들도 구할 수있다.
예를 들어서 111의 약수를 구할 때 √110 이하의 약수들은 1, 2, 5, 10 이고 이 것들을 110에 나누면 11, 22, 55, 110 이 나온다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> vec;
int main() {
int n = 110;
// sqrt를 안쓰고 i * i를 이용함
for (int i = 1; i * i < n; i++) {
if (n % i == 0) {
vec.push_back(i);
vec.push_back(n / i);
}
}
// 정렬
sort(vec.begin(), vec.end());
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << endl;
}
}
참고
'알고리즘' 카테고리의 다른 글
[알고리즘] GCD 최대공약수 구하기 알고리즘 (0) | 2022.04.29 |
---|