1. 정리
  2. 약수
  3. 최대 공약수
  4. 최소 공배수
  5. 소수
  6. 소인수분해

Java

정리

📝 작성 : 2023.01.21  ⏱ 수정 : 2년 전📚 읽는시간 : 4 분

약수

개념

어떤 수를 나누어 나머지가 없이 떨어지게 하는 수

약수의 개수 구하기

java
int divisorCount = 0;

반복문1

java
for (int i = 1; i <= n; i++) {
if (n % i == 0) {
divisorCount++;
}
}

반복문2

java
for (int i = 1; i <= Math.sqrt(n); i++) {
if (i == Math.sqrt(n)) divisorCount++;
else if (n% i == 0) divisorCount += 2;
}

약수 모두 구하기

java
List<Integer> divisors = new ArrayList<>();

반복문1

java
for (int i = 1; i <= n; i++) {
if (n % i == 0) {
divisors.add(i);
}
}

반복문2

java
for (int i = 1; i <= Math.sqrt(n); i++) {
if (i == Math.sqrt(n)) {
divisors.add(i);
} else if (n % i == 0) {
divisors.add(i);
divisors.add(n / i);
}
}
Collections.sort(divisors);

최대 공약수

개념

정수 a, b가 주어지고 r은 a % b 일 때, GCD(a, b) = GCD(b, r)

구현

재귀

java
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}

반복문

java
int gcd(int a, int b) {
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}

최소 공배수

개념

A = ad, B = bd에서 a, b는 서로소이고, d는 최대공약수이다
따라서 a * b * d 이고, 이는 (A * B / d) 이므로 최대공약수를 구함

구현

java
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
private int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}

소수

개념

소수는 1 이상의 자연수에서 1과 자기 자신만을 약수로 갖는 자연수

소수 판독

java
Set<Integer> primeNumbers = new LinkedHashSet<>();

반복문1

java
for (int i = 2; i < number; i++) {
if (number % i == 0) {
return false;
}
}
return true;

반복문2

java
for (int i = 2; i <= Math.sqrt(number); i++) {
if (number % i == 0) {
return false;
}
}

N 이하의 모든 소수 구하기

반복문1

java
for (int i = 2; i <= N; i++) {
boolean flag = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag) primeNumbers.add(i);
}

반복문2

java
for (int i = 2; i <= N; i++) {
boolean flag = true;
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag) primeNumbers.add(i);
}

에라토스테네스의 체

java
boolean[] primes = new boolean[N + 1];
for (int i = 2; i <= N; i++) {
primes[i] = true;
}
for (int i = 2; i <= Math.sqrt(N); i++) {
if (!primes[i]) continue;
for (int j = i * i; j <= N; j+=i) {
primes[j] = false;
}
}
for (int i = 0; i <= N; i++) {
if (primes[i]) {
primeNumbers.add(i);
}
}

소인수분해

개념

어떤 수를 소수(Prime)인 인수로 분해하는 것

구현

java
List<Integer> factors = new ArrayList<>();
for (int i = 2; i < Math.sqrt(n); i++) {
while(n % i == 0) {
factors.add(i);
n /= i;
}
}
if (n > 1) {
factors.add(n);
}

각 소수가 몇번씩 들어있나 구현

java
Map<Integer, Integer> factors = new HashMap<>();
for (int i = 2; i < Math.sqrt(n); i++) {
while(n % i == 0) {
factors.put(i, factors.getOrDefault(i, 0) + 1);
}
}
if (n > 1) {
factors.put(n, factors.getOrDefault(n, 0) + 1);
}
반응형