어떤 수 number의 약수의 개수를 구하는 방법은
1차원적으로 1부터 number까지 나눠서 0이 나오는 것이 약수이다.
for (int i = 1; i <= number; i++)
if (i % number == 0)
count++;
그런데 1부터 number까지 루프를 돌아야하므로 number이 커질수록 시간이 무지막지하게 늘어난다.
이를 개선하는 방법은 다른 약수를 이용하는 것이다.
약수는 자신을 곱해서 number가 되는 것 제외하과는 모두 쌍으로 묶어져있다.
예를 들어보면 number이 8이라고 하자.
맨처음 약수 1은 맨 뒤 약수 8과 묶여 곱하면 8이 된다.
그 다음 약수 2는 맨 뒤에서 하나 전 약수 4와 묶여 마찬가지로 곱하면 8이 된다.
이렇게 약수 개수가 짝수라면 모두 세트로 묶여있고
홀수라면 자기자신을 두번 곱해서 number가 되는 외톨이 약수가 하나 있는 것이다.
for (int i = 1; i * i <= number; i++)
if (i * i == number)
count++;
else if(num%i==0)
count += 2;
코드로 표현하면 위처럼 되고 i*i가 number보다 작을 때까지만 순회하면 된다.
'알고리즘' 카테고리의 다른 글
| [알고리즘] 최소 스패닝 트리 - 프림(Prim) 알고리즘 (0) | 2023.02.08 |
|---|---|
| [알고리즘] 플로이드 와샬 알고리즘 (0) | 2023.02.07 |
| [알고리즘] 에라토스테네스의 체 (소수 구하기) (0) | 2023.01.05 |
| [알고리즘] 최소 스패닝 트리 - 크루스칼(Kruskal) 알고리즘 (0) | 2022.07.11 |
| [알고리즘] 상호 배타적 집합 (Disjoint set), 유니온 파인드 (Union find) (0) | 2022.07.11 |