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 |
Tags
- 외적
- GJK
- Graham Scan
- SOH
- 우분투
- 유니티
- 리눅스
- C
- Doubly Connected Edge List
- 분할축 이론
- 다이나믹 프로그래밍
- 벡터
- 백준
- 문제풀이
- linux
- Vector
- AABB
- 충돌 알고리즘
- Unity
- uclidean algorithm
- C++
- 수학
- 알고리즘
- 보로노이다이어그램
- c#
- PS
- dp
- ubuntu
- 내적
- Expanding Polytope Algorithm
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 |
---|